接受的答案是正確的。 java.util.Date類沒有分配時區,但它的toString
實現混淆地應用了JVM的當前默認時區。
避免java.util.Date & .Calendar
這是很多原因,以避免出了名的麻煩java.util.Date,.Calendar,和SimpleDateFormat類與Java捆綁之一。避免它們。相反,請使用:
約達時間
在約達時間2.3如下一些示例代碼。搜索StackOveflow瞭解更多示例和大量討論。
DateTimeZone timeZoneLondon = DateTimeZone.forID("Europe/London");
DateTimeZone timeZoneAthens = DateTimeZone.forID("Europe/Athens");
DateTime nowLondon = DateTime.now(timeZoneLondon);
DateTime nowAthens = nowLondon.withZone(timeZoneAthens);
DateTime nowUtc = nowLondon.withZone(DateTimeZone.UTC);
java.time
的Java 8和更高版本有一個新的java.time package內置。這個軟件包受到了Joda-Time的啓發。雖然他們有一些相似之處和類名,但它們是不同的;每個都有其他缺點。一個顯着的區別是java.time避免了構造函數,而是使用靜態實例化方法。
在這個問題的情況下,他們的工作方式是一樣的。指定一個時區,然後調用now
方法獲取當前時刻,然後基於舊的不可變實例創建一個新實例以調整時區。
請注意兩個不同的時區類。一個是命名時區,其中包括夏令時和其他此類異常的所有規則以及來自UTC的偏移量,而另一個僅爲偏移量。
ZoneId zoneMontréal = ZoneId.of("America/Montreal");
ZonedDateTime nowMontréal = ZonedDateTime.now (zoneMontréal);
ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
ZonedDateTime nowTokyo = nowMontréal.withZoneSameInstant(zoneTokyo);
ZonedDateTime nowUtc = nowMontréal.withZoneSameInstant(ZoneOffset.UTC);
†其實java.util.Date
類確實有埋內its source code一個時區。但是班級爲了最實際的目的忽略了那個時區。所以,作爲簡寫,通常會說j.u.Date沒有分配時區。混亂?是。避免使用j.u.Date,並使用Joda-Time和/或java.time。
你想使用[喬達時間](http://stackoverflow.com/a/375803/1037210)?這是我的偏好。 – Lion
檢查[這個答案](http://stackoverflow.com/questions/230126/how-to-handle-calendar-timezones-using-java)。它可以派上用場。 – Gamb
我在網上發現了另一件事,它可能是最乾淨的解決方案,它使用日期時間格式來解析日期字符串並在相應時區返回日期 – Bober02