[英]TimeZone.getTimeZone(“PST”) vs TimeZone.getTimeZone(“America/Los_Angeles”)
我正在使用Java 8,
在我們的代碼中,我們使用的是sdf.setTimeZone(TimeZone.getTimeZone("PDT"));
轉換為美國太平洋由於PDT失敗(沒有丟失任何錯誤但轉換為默認時區)不是有效的ZoneId。
所以我尋找setTimeZone(TimeZone.getTimeZone("PST"));
這在TimeZone.getAvailableIDs()
值中也不可用。
最后我最終使用了sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));
現在,我們的一個朋友使用setTimeZone(TimeZone.getTimeZone("PST"));
轉換為我們太平洋時區,正在進行轉換..
問題是,
TimeZone.getTimeZone("PST");
之間的區別是什么? 和TimeZone.getTimeZone("America/Los_Angeles");
哪一個更好用?
引用Error Prone的ThreeLetterTimeZoneID檢查文檔:
根據
java.util.TimeZone
的Javadoc:為了與JDK 1.1.x兼容,還支持其他一些三字母時區ID(例如“PST”,“CTT”,“AST”)。 但是,它們的使用已被棄用,因為相同的縮寫通常用於多個時區(例如,“CST”可能是美國“中央標准時間”和“中國標准時間”),然后Java平台只能識別其中一個他們。
除了時區之間的模糊之外,返回時區遵守夏令時的方式也不一致,這意味着獲得的TimeZone可能與您的預期不符。 例子包括:
DateTime.getTimeZone("PST")
確實觀察夏令時; 但是,標識符表示它是太平洋標准時間,即未觀察到夏令時。DateTime.getTimeZone("EST")
(以及"MST"
和"HST"
)不遵守夏令時。 但是,這與PST(和其他)不一致,因此您可能會認為會觀察到夏令時。
所以:使用完整的America/Los_Angeles
格式來最小化代碼中的歧義。
根據Java 8 Timezone文檔 ,不推薦使用PST
因為相同的縮寫通常用於多個時區。 這就是為什么首選使用America/Los_Angeles
TL; DR不要使用PST。 使用America / Los_Angeles。 也不要使用TimeZone
類。 使用ZoneId
。
TimeZone
類解釋PST與America / Los_Angeles相同,正如其他人長期所說的那樣,不推薦使用三個字母的縮寫。 如果TimeZone
有一天(但不太可能)停止識別PST,它將改為給你GMT,這肯定不是你想要的。 TimeZone
類設計糟糕,有時令人困惑,幸好已經過時了,取而代之的是5年前現代Java日期和時間API ZoneId
的ZoneId。
一個簡短的代碼示例,可幫助您開始使用現代API:
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL)
.withLocale(Locale.US);
ZonedDateTime dateTime = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));
System.out.println(dateTime.format(formatter));
2019年4月12日星期五太平洋夏令時間上午8:14:09
ZoneId
一個優點是它不容易讓你使用PST
作為時區: ZoneId.of("PST")
拋出java.time.zone.ZoneRulesException: Unknown time-zone ID: PST
(有一個解決方法,如果你堅持,但正如我們所說,你不應該)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.