2016-11-11 64 views
0

我在Android上使用ACTION_TIMEZONE_CHANGED意圖過濾器來響應時區更改。喬達時區IDS是否與JAVA時區ID相同?

我注意到,Jodas當前時區是不會在這個時候使用更新: DateTimeZone.getDefault()

當我使用Java的默認TimeZone.getDefault(),正確的時區。

注意:當我再次更改:喬達有我改變它之前的價值。所以它落後了(Android在啓動廣播意圖時尚未更新)。

所以我只能使用當前時區的Java時區。但是我的域對象使用Joda DateTimeZone的。現在我想比較當前的時區和我的域對象中的時區。難道要這樣做:

TimeZone currenTimeZone = TimeZone.getDefault(); 
if(action.getLocation().getDateTimeZone().getID().equals(currenTimeZone.getID()))) { 
[...] 
} 

? 或者兩個庫的時區id可以不同嗎?

+0

如果您想要更有幫助的答案,請編輯您的問題以包括具體的問題值。 –

回答

5

TL;博士

不,不是安全承擔時區:

  • 存在。
  • 具有定義的特定標識符。
  • 具有相同的定義/規則。

的tzdata

大多數操作系統和軟件庫依賴於IANA維護提供當前和過去的時區信息tz database。也被稱爲tzdataTZDB。以前稱爲奧爾森數據庫

變動頻繁

在世界各地,政治家喜歡經常改變,重新定義,重新安排,重命名,並在其他時區的定義和規則瞎搞。他們經常這樣做,只有很少的預警,比如現在在Turkey(2016年秋季)的兩個月內。

有時會定義新的時區。因此,在這方面,要專門回答您的問題:是的,tzdata的某些副本可能具有較舊的時區定義,這些定義在較舊的副本中不存在,因此可能存在時區標識符的差異。

此外,新名稱有時會給現有時區。例如,印度最近恢復了他們的城市名稱,Asia/Calcutta現在也被標記爲Asia/Kolkota。再次,老tzdata副本不會知道這個新的名字。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

某些軟件會擴展tzdata以嘗試識別這些僞時區。不是一個好主意。但是,這又意味着使用這些非標準時區標識符可能在一個地方工作,而不是另一個地方。堅持使用官方時區名稱。

某些區域有display name,例如British Time。但你應該從來沒有使用它作爲標識符。

更新

系統管理員必須在所有可能使用的各種場所,以更新的tzdata的努力:

  • 操作系統
  • Java虛擬機
  • 軟件庫(例如作爲Joda-Time,可能還有ThreeTen-Backport)。

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);