1

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

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 计算错误的日期?

在此先感谢并从德国打招呼。

4

2 回答 2

2

这将取决于 getFirstDayOfWeek() 返回什么以及 1 月 1 日是哪一天。

来自 Javadocs:

为 WEEK_OF_YEAR 字段计算的值范围为 1 到 53。一年的第 1 周是从 getFirstDayOfWeek() 开始的最早的 7 天时间段,其中至少包含该年的 getMinimalDaysInFirstWeek() 天数。因此,它取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 和 1 月 1 日的星期几的值。一年的第 1 周和下一年的第 1 周之间的周按从 2 到 52 或 53 的顺序编号(如需要)。

For example, January 1, 1998 was a Thursday. If getFirstDayOfWeek() is MONDAY and getMinimalDaysInFirstWeek() is 4 (these are the values reflecting ISO 8601 and many national standards), then week 1 of 1998 starts on December 29, 1997, and ends on January 4, 1998. If, however, getFirstDayOfWeek() is SUNDAY, then week 1 of 1998 starts on January 4, 1998, and ends on January 10, 1998; the first three days of 1998 then are part of week 53 of 1997.

于 2011-08-25T11:51:31.747 回答
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()等将保留先前计算的日期。

于 2011-08-25T11:49:25.803 回答