Java 日历。获取实际最大值(日历。一年中的一周)古怪

Java 日历。获取实际最大值(日历。一年中的一周)古怪,java,calendar,week-number,Java,Calendar,Week Number,要么我不理解方法getActualMaximum(int),要么我不理解每年的字段周,要么我有一个Sun bug(或全部三个)…有人能给我解释一下为什么(至少在德语地区)会出现以下代码: Locale.setDefault( Locale.GERMAN ); Calendar c = Calendar.getInstance(); c.set( Calendar.YEAR, 2010 ); c.set( Calendar.MONTH, 0 ); c.set

要么我不理解方法
getActualMaximum(int)
,要么我不理解每年的字段周,要么我有一个Sun bug(或全部三个)…有人能给我解释一下为什么(至少在德语地区)会出现以下代码:

    Locale.setDefault( Locale.GERMAN );
    Calendar c = Calendar.getInstance();
    c.set( Calendar.YEAR, 2010 );
    c.set( Calendar.MONTH, 0 );
    c.set( Calendar.DAY_OF_MONTH, 1 );
    System.out.println("max:    "+c.getActualMaximum( Calendar.WEEK_OF_YEAR ));
    System.out.println("actual: "+c.get( Calendar.WEEK_OF_YEAR ));
生成以下输出:

    max:    52
    actual: 53
下面是
getActualMaximum(int)
的Javadoc:

返回 指定的日历字段可能有, 给定此日历的时间值。 例如,实际最大值 在某些情况下,“月份”字段为12 年,其他年份为13年 希伯来历法系统


编辑

情节越来越复杂在英语区域设置中(
-Duser.language=en-Duser.country=us
)输出为:

    max:    52
    actual: 1

似乎指出这是德国地区的一个太阳虫?

此信息是正确的:

max:    52
actual: 53
2010年最多有52周。实际的一周是53周,因为2009年最多有53周,大多数周从周日或周一开始。在大多数情况下,第一周是一年中的第一周,1月份有4天。由于2010年1月1日这一周只有2到3天,因此这一周被视为2009年的一部分

很可能英语地区有不同的规则来确定第一周,比如第一周是1月1日的一周


维基百科对此的解释是正确的:

问题是,2010年1月1日是2009年的第53周(在德国),但2010年只有52周(2010年12月31日是第52周)。不幸的是,Java Calendar对象没有与周数相关的年份字段。

天从1开始,而月从零开始?嗯,是的。信不信由你谢谢……但就我阅读Javadoc而言,getActualMaximum似乎并没有给我一年的最大值,而是给了日历的时间值:那么这不应该给我一个1月1日的实际最大值53吗?取决于实际时间。2010年有52周,2009年有53周。你应该看一下实际实现的源代码是的,这就是我最后要做的…在看了源代码之后,我基本上想出了一个解决办法:要获得一年的实际最大值,请获得12月31日的日历周。如果该值为1,则该年的实际最大值为52。这么复杂…;)