例如:
Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );
Run Code Online (Sandbox Code Playgroud)
打印1
Joda时间也是如此.
:)
这些是包中的两个字段java.time.temporal:
WeekFields.ISO.weekBasedYear()
ISO-8601定义了除其他两种日期之外的所谓周日期,即通常的日历日期(包括年,月和日)和顺序日期(包括年和日) ).星期日的格式为YYYY-'W'ww-e.w代表一周的年份,e代表数字ISO-星期几.Y代表以周为基础的年份,与日历年相同,但在日历年的开始或结束时除外,因为基于周的年份与最终可能在上一年开始的周周期相关联.有两条规则对于理解星期日的形成非常重要:
乍一看,两个JSR-310字段看起来都是相同的,因为ISO-8601只提到了一种基于周的年份.但是等一下,惊喜.让我们考虑以下代码示例:
LocalDate date1 =
LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014);
System.out.println("IsoFields-Test: " + date1); // output: 2014-03-01
LocalDate date2 =
LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014);
System.out.println("WeekFields-Test: " + date2); // output: 2014-02-25
Run Code Online (Sandbox Code Playgroud)
虽然我非常了解第二种变化,但我很惊讶看到第一次约会的不同结果是在其类名中使用"官方"ISO-8601-reference.要解释计算结果:
2000-02-29日期对应于ISO-weekdate-notation中的2000-W09-2,而2014-02-25对应于2014-W09-2,保留了一周中的星期和星期几.到目前为止很好.较小字段的这种保留特性类似于如何更改日历年的规则(在大多数情况下应该保持日历日期中的月份和日期不变).
但结果2014-03-01是什么?这里算法简单地将相应的周日添加了四天,以便考虑字段"日期"(29对25)的差异.我没有找到此行为的任何来源或官方文档.有谁知道我们在哪里可以找到这两个领域之间差异的理由?有关算法行为的任何文档?
更新:
现在,我尝试使用此表达式测试新API的自我一致性,以便找出更好地支持哪两个字段:
System.out.println(
"14 week-based-years later = "
+ LocalDate.of(2000, 2, 29).plus(14, IsoFields.WEEK_BASED_YEARS));
Run Code Online (Sandbox Code Playgroud)
输出是2014-03-01类似于描述的情况IsoFields.WEEK_BASED_YEAR,尽管我仍然发现2014-02-25(= 2014-W09-2)的结果更合乎逻辑.由于此类时间单元也在类中找到,IsoFields因此行为在类中是自洽的IsoFields.看起来像一个没有文档和非直观的"功能".
我使用的版本是:java.runtime.version = 1.8.0-b132
更多测试:
LocalDate d = LocalDate.of(2014, 3, 1); // 2014-W09-6
System.out.println( …Run Code Online (Sandbox Code Playgroud) 有没有办法做到这一点:如何获得一周的日期(我知道周数)?对于ISO 8601 周数而不使用Java中的任何库或日历?
我必须做一些报告,并且必须在Java和MySQL的任何日期计算周,但他们有不同的算法.
首先,请注意,通过一些方法,在某一年结束的某些日子里,是明年的第一周.示例:2012-12-31是2013年的第1周(我不记得确切的年份,但它就是这样).所以我必须计算一个约会的正确的一周
在Java中,它基于2个标准,取决于区域设置:
第一周的最短日期(1或4)
Calendar cal = Calendar.getInstance();
int javaWeek = cal.get(Calendar.WEEK_OF_YEAR);
int weekYear = cal.getWeekYear();
Run Code Online (Sandbox Code Playgroud)在MySQL中,它基于2个标准依赖于模式(0到7):
第一周的最小天数为4或第一周包含一周的第一天
SELECT WEEK('2012-12-12', 1);
SELECT YEARWEEK('2012-12-12', 1);
Run Code Online (Sandbox Code Playgroud)在MySQL中,一些模式将计算一周的奇怪结果,例如,一年有0周只有1天,其他几周有整整7天(我认为第1周真的是第一周,第0周是前周或某事).我会忽略这些模式
方案是:我在Java中计算了我的系统区域设置(带有设置:getFirstDayOfWeek()==SUNDAY和的区域设置getMinimalDaysInFirstWeek==1)的日期基础列表的周,我想在MySQL中使用相同的结果进行计算
但是我在MySQL中尝试所有8种模式,没有匹配.我失败了,因为在MySQL中没有第一周最小日的模式计算基础是1(只有一些模式有4),所以我手动setMinimalDaysInFirstWeek(4)和MySQL中的模式6匹配Java中的结果
(我必须编写测试,比较Java和MySQL中2年内每天的结果)
所以我的解决方案是,我必须修复 setMinimalDaysInFirstWeek(4),如果getFirstDayOfWeek()是星期一,我在MySQL中选择模式3,如果 getFirstDayOfWeek()是SUNDAY,我在MySQL中选择模式6.我认为这只是一个临时解决方案而且非常奇怪.
还有一个问题,我真的害怕如果我的系统从MySQL变为其他RDBMS,它将有其他方法而我无法处理所有这些(Oracle中的示例没有WEEK功能).那么有什么方法可以让calc周满足很多RDBMS吗?
我有一个想法是在一个平台(Java或MySQL)中的计算周,然后将结果传递给另一个:
如果从Java传递到MySQL,我将结果传递给查询字符串,或者构建一个包含我的结果的表
如果从MySQL传递给Java,我必须编写一个从Java调用它的过程,并且必须解决问题"找到计算方法满足许多RDBMS的方法"
但我必须计算大量的日期,这些都不能满足我,任何人都有想法解决我的问题?
我想获取具有给定日期的当前星期,例如,如果日期为2016/01/19,则结果为:week number: 3
我已经看到了一些有关此的问题和答案,但是我无法实现我想要的。这是我所做的:
public static int getCurrentWeek() {
String input = "20160115";
String format = "yyyyMMdd";
SimpleDateFormat df = new SimpleDateFormat(format);
Date date = df.parse(input);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.WEEK_OF_YEAR);
return week;
}
Run Code Online (Sandbox Code Playgroud)
我从这个问题中获取了这段代码,但是在这一行上有一个错误:
Date date = df.parse(input);
Run Code Online (Sandbox Code Playgroud)
未处理的异常类型ParseException
我想创建一个日历对象,并将其设置为该年的某一年和一周.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.WEEK_OF_YEAR, weekOfYear); // 1
calendar.set(Calendar.YEAR, year); // 2016
setWeekChecked(calendar);
Run Code Online (Sandbox Code Playgroud)
当我将它传递给setWeekChecked方法时,这是日历对象的toString:
java.util.GregorianCalendar中[时间= ?, areFieldsSet =假,宽大=真,区=美国/纽约,Firstdayofweek可= 1,minimalDaysInFirstWeek = 1,ERA = 1,YEAR = 2016,MONTH = 0,WEEK_OF_YEAR = 1,WEEK_OF_MONTH = 2,DAY_OF_MONTH = 7,DAY_OF_YEAR = 7,DAY_OF_WEEK = 5,DAY_OF_WEEK_IN_MONTH = 1,AM_PM = 0,HOUR = 5,HOUR_OF_DAY = 5,MINUTE = 25,SECOND = 43,微差= 219,ZONE_OFFSET = -18000000,DST_OFFSET = 0 ]
在setWeekChecked方法中:
public void setWeekChecked(final Calendar cal) {
final int targetWeek = cal.get(Calendar.WEEK_OF_YEAR); // Returns 1
final int targetYear = cal.get(Calendar.YEAR); // Returns 2015??
} …Run Code Online (Sandbox Code Playgroud)