簡體   English   中英

TimeZone.getTimeZone(“PST”)vs TimeZone.getTimeZone(“America / Los_Angeles”)

[英]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

根據TZ數據庫,更好的是使用“America / Los_Angeles”,因為這是有效的時區。 看到這個鏈接

為了與JDK 1.1.x兼容,還支持其他一些三字母時區ID(例如“PST”,“CTT”,“AST”)。 但是,它們的使用已被棄用,因為相同的縮寫通常用於多個時區(例如,“CST”可能是美國“中央標准時間”和“中國標准時間”),然后Java平台只能識別其中一個他們..

看到這個鏈接

您還可以看到 SO后,顯示問題,使用3個字母的時區ID。

TL; DR不要使用PST。 使用America / Los_Angeles。 也不要使用TimeZone類。 使用ZoneId

  • PST可能意味着皮特凱恩標准時間,太平洋標准時間或菲律賓標准時間。
  • 如果您將PST視為太平洋標准時間,那么這不是一個時區,因為所有使用它作為標准時間的地方目前和太平洋日光時間的大部分時間都是。
  • 雖然過時的TimeZone類解釋PST與America / Los_Angeles相同,正如其他人長期所說的那樣,不推薦使用三個字母的縮寫。 如果TimeZone有一天(但不太可能)停止識別PST,它將改為給你GMT,這肯定不是你想要的。

java.time

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM