Java:GregorianCalendar返回错误的数据

时间:2011-08-25 11:42:36

标签: java calendar gregorian-calendar

我想计算一年特定周数的星期一。我就是这样做的:

final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date

这必须返回2012年5月14日(德语格式为14.05.12),但它将返回2012年5月16日,但这是错误的。

因此2012年的+ 2,2011是正确的,2010年是-1。

为什么GregorianCalendar计算错误的日期?

提前致谢并欢迎来自德国。

2 个答案:

答案 0 :(得分:2)

这取决于getFirstDayOfWeek()返回的内容以及1月1日的哪一天。

来自Javadocs:

  

为WEEK_OF_YEAR字段计算的值范围为1到53.周   1年一年是最早的七天开始   getFirstDayOfWeek()至少包含getMinimalDaysInFirstWeek()   那一年的日子。因此它取决于的价值   getMinimalDaysInFirstWeek(),getFirstDayOfWeek(),以及   1周的一周1.一年的第1周和第1周的第1周   下一年按顺序从2到52或53(如   需要)。

     

例如,1998年1月1日是星期四。如果getFirstDayOfWeek()是   MONDAY和getMinimalDaysInFirstWeek()是4(这些是值   反映ISO 8601和许多国家标准),然后是1998年第1周   从1997年12月29日开始,到1998年1月4日结束。但是,如果   getFirstDayOfWeek()是SUNDAY,1998年1月1日开始   1998年4月10日,1998年1月10日结束; 1998年头三天   然后是1997年第53周的一部分。

答案 1 :(得分:1)

尝试设置DAY_OF_WEEK

final GregorianCalendar calendar = new GregorianCalendar(Locale.GERMANY);
calendar.clear();
calendar.set(Calendar.YEAR, 2012); // set to 2012
calendar.set(Calendar.WEEK_OF_YEAR, 20); // set to week number 20
calendar.set( Calendar.DAY_OF_WEEK, Calendar.MONDAY ); //set day to monday
calendar.setTimeZone(TimeZone.getTimeZone("Europe/Berlin")); // set time zone

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yy"); // german format
System.out.println(sdf.format(calendar.getTime())); // return date

对我来说,返回14.05.12,16.05.11和17.05.10。

编辑:

  

因此,2012年的+ 2,2011是正确的,2010年是-1。

如果我理解正确,你会得到16.05.10,16.05.11和16.05.12,对吗? 这表明日历的一部分被重用。从2011年开始,你有没有连续测试过?如果是这样,仅在没有任何clear()等的情况下更改年份将保留先前计算的日期。