我正在使用java日曆在午夜(GMT)創建某個日期,然後將時區更改爲我的本地時區以確保請求的時間爲1:00(GMT + 1)。下面的代碼工作,包括。 2成功斷言。Java日曆時區更改無法按預期工作
TimeZone TIMEZONE_GMT = TimeZone.getTimeZone("GMT");
TimeZone TIMEZONE_LOCAL = TimeZone.getDefault(); // GMT + 1
private Calendar getMidnightGmtCalendarWithLocalTimezone() {
Calendar calendar = Calendar.getInstance(Locale.GERMAN);
calendar.set(2017, Calendar.JANUARY, 1, 0, 0, 0);
calendar.setTimeZone(TIMEZONE_GMT); // Probably not required
assertEquals(0, calendar.get(Calendar.HOUR_OF_DAY)); // Assert 1
// Log.i("TAG", "" + calendar.get(Calendar.HOUR_OF_DAY));
calendar.setTimeZone(TIMEZONE_LOCAL);
assertEquals(1, calendar.get(Calendar.HOUR_OF_DAY)); // Assert 2
return calendar;
}
現在我刪除第1個斷言,我預計沒有任何變化。現實:第二個斷言現在失敗!我試圖理解.get()的實現,顯然它也計算一些時間,所以它不僅僅是收集值。但我不明白爲什麼我的第二個斷言失敗。
第二屆斷言重新獲得成功時,我去掉日誌行(只是要確定從calendar.get(問題出現),而不是斷言!)
所以,第一個問題:爲什麼會發生這種情況? 第二個問題:我如何確保在爲Timezone GMT的午夜時間設置時間後,我有本地時區的Calendar實例? (換句話說,我怎樣才能正確地轉換時區?)
編輯: 我在Android上使用這個,所以不能使用Java8。喬達時間(如下所示)是一個很好的選擇,我肯定會研究這一點。但是,作爲我的問題的答案,我想知道它如何與Java7 Calendar配合使用,因爲我現在已經綁定了該代碼。
我建議放棄日曆並嘗試新的java.time包,如果您在JDK 8上。您應該是 - 它是唯一未通過支持生命週期的JDK。 – duffymo
@duffymo我完全同意你,只是想知道,你能否提供任何關於*爲什麼要使用Calendar類應該被放棄的權威性描述? – Andremoniy
權威性? java.util.Calendar是JDK 1.0年份。自從一開始就承認它很複雜且難以使用。 (如果我沒有記錯的話,由IBM撰寫。)JODA的開發旨在解決這些缺陷。它非常成功,因此Oracle將它作爲java.time包裝到JDK 8中。日曆是一個20歲以上的故障。它被一些被認爲是巨大改進的東西所取代。我基於歷史聲稱權威。這對你來說足夠好嗎? – duffymo