2011-12-05 129 views
5

我做了以下內容:Java日曆返回不同的日期

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Europe/Berlin")); 
c.setFirstDayOfWeek(Calendar.MONDAY); 
c.set(Calendar.DAY_OF_MONTH, 9); 
c.set(Calendar.MONTH, 3); 
c.set(Calendar.YEAR, 2011); 
c.set(Calendar.HOUR_OF_DAY, 10); 
c.set(Calendar.MINUTE, 20); 
int week = c.get(Calendar.WEEK_OF_YEAR) 

在我的本地機器我的時區是歐洲/柏林。在我的服務器上是UTC。 在本地框上運行此代碼將返回week = 14. 在我的服務器上運行此代碼將返回week = 15.

我不知道 - 有人可以向我解釋嗎?這使我麻煩大了:-(

感謝任何指針。

乾杯, 基督教

+1

你確定你得到不同的結果?從代碼片段看,它在什麼時區並不重要,因爲無論如何你都是手動設置日期和小時。這個代碼總是會在我腦海中返回15。 – BVSmallman

+0

是的,我非常確定:我已經從Junit測試中複製出來了。它運行本地,但在我的服務器上失敗。 :-( – Christian

+0

我認爲你已經搞亂了你的副本或者你的實驗,如果我在我的機器上運行這個代碼([full copy](http://pastie.org/2972306)),它被設置爲GMT/BST(BST截至當天),我得到了星期= 14。此外,我不明白爲什麼柏林時間與UTC有關 - 在這種情況下 - 上午10點20分(柏林)或8點20分am(UTC - 由於柏林將在4月的DST上,它是+2而不是+1),無論哪種方式仍然是第14周。 –

回答

4

這是你的語言環境。有de_DE這個Java時語言環境的星期爲14,具有en_US區域時這個星期是15.將你的機器設置爲相同的語言環境,並且他們現在應該工作

我只測試了我的語言環境與德語語言環境,並且無法在網上找到可靠的列表,但我確定這是你的問題。

以編程方式看到您的區域設置:

Locale.getDefault(); 

要更改您的區域設置在Windows 7:

Control Panel --> Region & Language --> Location Tab --> Current Location 
+0

我懷疑這確實是什麼。 @Christian,如果我使用[This code](http://pastie.org/2972365),它使用'Locale.GERMAN',我得到'week = 14';但如果我使用[此代碼](http://pastie.org/2972369)將我的區域設置更改爲美國,我會得到'week = 15'。 –

+1

+1;但不是改變整個應用程序的語言環境,只需調用'c.setMinimalDaysInFirstWeek(1)'(爲了獲得美式風格)或'c.setMinimalDaysInFirstWeek(7)'(獲得德式風格到處)。當然,這將取決於業務需求。 – ruakh

+0

啊第一週最小的天,很好。這個答案(或新的答案)應該描述這個特徵,這絕對不是顯而易見的! –