2010-01-12 213 views
4

要么我不明白的方法getActualMaximum(int)或字段WEEK_OF_YEAR,或有太阳错误(或所有三个)...有人可以向我解释为什么(至少在德语语言环境 ...)下面的代码:Calendar.getActualMaximum(Calendar.WEEK_OF_YEAR)怪异

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:

返回给定此日历的时间值的指定日历字段可能具有的最大值 。 例如,MONTH字段的实际最大值 在某些 年是12,在其他年份是在希伯来语日历系统的 。


编辑

情节复杂。 在英语语言环境-Duser.language=en -Duser.country=us)输出为:

max: 52 
    actual: 1 

似乎指向它是一个Sun错误德语语言环境?

+0

天从1开始,但几个月从零开始? – 2010-01-12 08:48:29

+0

呃是的。信不信由你。 :) – Epaga 2010-01-12 08:51:15

回答

3

这些信息是正确的:

max: 52 
actual: 53 

2010年全年有最多52周。实际的一周是53,自2009年以来最多53周,大多数周始于周日或周一。第一周大多数情况下是一年的第一周,一月份为4天。由于1月1日这一周在2010年只有2或3天,因此本周被认为是2009年的一部分。

很可能英语语言环境对于确定第1周具有不同的规则,如第1周是1月的周1。

维基百科的正确解释是:wikipedia week article

+0

谢谢......但据我读Javadoc,似乎getActualMaximum不给我一年的最大值,而是日历的时间值:所以不应该给我一个实际的1月1日最多53人? – Epaga 2010-01-12 09:52:02

+0

取决于什么是实际的时间。 2010年有52周,2009年有53周。你应该看看实际实现的源代码 – Salandur 2010-01-12 10:29:26

+0

是的,这是我最终做的......在查看源代码后,我基本上想出了一个解决方法:获得TRUE实际最大值一年,得到12月31日的日历周。如果这是1,那么当年的实际最大值是52.所以frickin'复杂...;) – Epaga 2010-01-12 10:34:11

2

的问题是,2010年1月1日是在53 09年(在德国)一周,但2010年仅有52个周(2010年12月31日的52周)。不幸的是,Java日历对象并没有一个与该周数相关的年份的字段。

+0

但是如何获得那一周的正确年份? – Kdeveloper 2011-02-27 15:27:40