Java:GregorianCalendar 返回错误数据

发布于 2024-12-01 09:11:00 字数 671 浏览 5 评论 0原文

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

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

预先感谢并来自德国的问候。

I want to calculate the monday of a specific week number of a year. This is how I do it:

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

This has to return the 14th of May 2012 (14.05.12 in german format), but it returns the 16th of May 2012, but this is wrong.

So for 2012 its +2, 2011 is correct and 2010 is -1.

Why does the GregorianCalendar calculate the wrong date?

Thanks in advance and greets from germany.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦太阳 2024-12-08 09:11:00

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

来自 Java 文档:

WEEK_OF_YEAR 字段的计算值范围为 1 到 53。 周
1 一年是最早的 7 天时间段,从
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() 是星期日,那么 1998 年的第 1 周从 1 月开始
1998年4月4日至1998年1月10日结束; 1998年的前三天
然后是 1997 年第 53 周的一部分。

It will depend on what getFirstDayOfWeek() returns and also what day the 1st of January falls on.

From Javadocs:

Values calculated for the WEEK_OF_YEAR field range from 1 to 53. Week
1 for a year is the earliest seven day period starting on
getFirstDayOfWeek() that contains at least getMinimalDaysInFirstWeek()
days from that year. It thus depends on the values of
getMinimalDaysInFirstWeek(), getFirstDayOfWeek(), and the day of the
week of January 1. Weeks between week 1 of one year and week 1 of the
following year are numbered sequentially from 2 to 52 or 53 (as
needed).

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.

晨曦÷微暖 2024-12-08 09:11:00

也尝试设置 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() 等将保留之前计算的日期。

Try setting the DAY_OF_WEEK, too:

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

Returns 14.05.12, 16.05.11 and 17.05.10 for me.

Edit:

So for 2012 its +2, 2011 is correct and 2010 is -1.

If I understand that correctly, you get 16.05.10, 16.05.11 and 16.05.12, right?
That indicates that part of the calendar is reused. Did you, by any chance, test in a row starting with 2011? If so, changing the year only without any clear() etc. would keep the previously calculated date.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文