TL;博士
不,不是安全承擔時區:
- 存在。
- 具有定義的特定標識符。
- 具有相同的定義/規則。
的tzdata
大多數操作系統和軟件庫依賴於IANA維護提供當前和過去的時區信息tz database。也被稱爲tzdata
或TZDB
。以前稱爲奧爾森數據庫。
變動頻繁
在世界各地,政治家喜歡經常改變,重新定義,重新安排,重命名,並在其他時區的定義和規則瞎搞。他們經常這樣做,只有很少的預警,比如現在在Turkey(2016年秋季)的兩個月內。
有時會定義新的時區。因此,在這方面,要專門回答您的問題:是的,tzdata的某些副本可能具有較舊的時區定義,這些定義在較舊的副本中不存在,因此可能存在時區標識符的差異。
此外,新名稱有時會給現有時區。例如,印度最近恢復了他們的城市名稱,Asia/Calcutta
現在也被標記爲Asia/Kolkota
。再次,老tzdata副本不會知道這個新的名字。
在continent/region
的格式指定一個proper time zone name,如America/Montreal
,Africa/Casablanca
,或Pacific/Auckland
。切勿使用3-4字母縮寫,如EST
或IST
,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。
某些軟件會擴展tzdata以嘗試識別這些僞時區。不是一個好主意。但是,這又意味着使用這些非標準時區標識符可能在一個地方工作,而不是另一個地方。堅持使用官方時區名稱。
某些區域有display name,例如British Time
。但你應該從來沒有使用它作爲標識符。
更新
系統管理員必須在所有可能使用的各種場所,以更新的tzdata的努力:
JVM的提供者通常在更新JVM時包含最新版本的tzdata。但是政客們比Java更新更頻繁地使用時區。所以你可能需要手動更新JVM。 Oracle爲Oracle提供Timezone Update Tool & OpenJDK JVM。
Joda-Time包含自己的tzdata副本。因此,您需要更新Joda-Time庫或手動更換tzdata。請注意,Joda-Time項目現在處於維護模式,並建議轉移到Java 8及更高版本捆綁的java.time類。
列出已知標識符
的java.time類可以告訴你他們的known zone identifiers的列表。
Set<String> zoneIds = ZoneId.getAvailableZoneIds() ;
其他圖書館和操作系統也許能夠做到這一點。
與Java的早期版本中捆綁避免遺留日期時類
麻煩的舊日期,時間類現在是傳統,由java.time類取代。
所以你的TimeZone.getDefault()
使用,現在由ZoneId.systemDefault
過時:
ZoneId z = ZoneId.systemDefault() ;
String zoneIdentifier = z.toString() ;
使用來獲得當前時刻的特定區域。
ZonedDateTime zdt = ZonedDateTime.now(z);
如果您想要更有幫助的答案,請編輯您的問題以包括具體的問題值。 –