2010-01-12 215 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