2016-03-07 60 views
1

使用UTC時區時,我遇到了Calendar和SimpleDateFormatter的一些意外行爲。它看起來像SimpleDateFormatter給出了正確的結果,但日曆不是。我不知道爲什麼。我使用下面的代碼來生成日期使用日曆:帶日曆的時區

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
    cal.set(Calendar.YEAR, 2012); 
    cal.set(Calendar.MONTH, Calendar.MARCH); 
    cal.set(Calendar.DAY_OF_MONTH, 5); 
    cal.set(Calendar.HOUR, 0); 
    cal.set(Calendar.MINUTE, 0); 
    cal.set(Calendar.SECOND, 0); 

換句話說,2012年3月5日00:00 UTC。
當我在本地CST時區打印這個時候,我得到:

Mon Mar 05 06:00:00 CST 2012
這很奇怪,因爲CST是UTC-6:00,所以我預計2012年3月4日星期日18:00 CST(即午夜前6小時前一天)。相反,我在UTC 6小時後得到

當我使用像這樣一個SimpleDateFormatter:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 
    df.setTimeZone(TimeZone.getTimeZone("UTC")); 
    df.parse("2012-03-05"); 

我得到預期的 「星期日2012年3月4日18:00 CST」,這是UTC6小時,即UTC-6:00 。

爲什麼我的結果錯了?

回答

1

Calendar.HOUR以12小時格式設置小時,因此您不會將其設置爲午夜,而是設置爲12點。

使用Calendar.HOUR_OF_DAY代替或確保還設置了AM/PM值:

cal.set(Calendar.AM_PM, Calendar.AM); 
+0

哇,這是微妙的和可怕的。感謝您指出了這一點。改變它之後,單元測試現在通過。大! – PatrickB

+0

它是。 Java 8之前的日期/時間函數確實存在問題。如果你打算和他們打交道,而且你不能使用Java 8,你可能需要查看一些特定的庫,例如[JodaTime](http://www.joda.org/joda-time/)。 –