2014-01-22 51 views
0

有誰知道爲什麼這種方法的行爲是這樣嗎? 2013是不是閏年,所以我希望,如果我有一個DateTime對象,如:DateTime getDayOfYear()返回366爲12-31-2013而不是365

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");   
    DateTime dt = formatter.parseDateTime("2013-12-31 23:59:52"); 

dt.getDayOfYear() 

會給我365,但它給了我366.有人能看到什麼問題是? 我也越來越366,如果我做

dt.toString("DDD"); 

我將不勝感激任何輸入任何可能。

+3

它給了我365. –

+5

這可能是一個時區問題,在這種情況下我們需要@JonSkeet。 – Sinkingpoint

+1

如果你發佈你的時區,這將是一件好事。 –

回答

0

讓我試着根據我從文檔和代碼中讀取的內容做出答案。

我假設你的時間戳確實是你認爲的,也就是2013 UTC的最後一刻。

您在默認時區中創建了一個DateTime對象,其中郵戳爲。所以如果你的本地時區是+01:00,這是2013-14-01 00:59 +01:00

現在您使用withZoneRetainFields(UTC)。從文檔我明白,這改變了毫秒,使他們實際上反映2014-01-01 00:59 UTC,基本上這需要添加3600 * 1000毫秒的時間戳,同時將對象的時區條目更改爲UTC。

當你再問問全年的那一天,究竟發生了內部是

.dayOfYear().get(getMillis())

我的預感是dayOfYear仍是基於2013年和從這個底線你得到一天366

(我不完全相信我自己這個答案,我必須承認,我不知道是否可能只是潛伏在喬達的一個bug。)

無論如何:如果你有UTC時間戳,我可能會建議只使用新的DateTime(stamp, UTC)其中UTC a DateTimeZone對象。從而避免了令人費解的雙重區域轉移。 編輯:此外,如果你從DB的郵票是真正的UTC,通過使用withZoneRetainFields你改變這張郵票來表示另一個時間點,這是一個很好的機會做錯任何你想做的事情。在日期/時間處理的混淆區域,millis中的時間戳是一個易於理解的項目。如果它不只是爲了顯示目的,我絕不會碰它。

+0

謝謝@Harald。如果事實上發生了什麼,這確實會讓它神祕化。我至少會嘗試你最後的建議,看看它是否會以任何方式改變結果(我會發布我得到的結果)。我在想自己是否有潛伏在喬達的蟲子。 – Lani1234

+0

謝謝@Harald。剛看到你的編輯。我正在獲得一個新的謎團。我想在12/25/2013獲得每一分鐘的時間。除了第1140-1154分鐘(全天19小時)之外,一切都很好。他們每個休息一天。因此,對於第1139分鐘,我有紀元時間1388015940,這是正確的。然後分鐘1140跳到1387929600.從1140-1154,他們增加了60秒,這是正確的,但全部關閉了一天。然後在1155分鐘,他們回到1388016900的正確時間。你能想到這個的任何理由嗎? – Lani1234

+0

從你寫日期的方式來看,我想你現在住在美國。從19小時的奇怪行爲,我進一步猜測你處於-05:00時區,東部地區。顯然,你不知何故發現了本地日期/時間對象的行爲。請考慮只創建具有已在構造函數中指定的特定時區的DateTime對象。 – Harald

相關問題