2016-11-11 9 views
0

タイムゾーンの変更に対応するために、AndroidでACTION_TIMEZONE_CHANGEDインテントフィルタを使用しています。jodaタイムゾーンIDはJavaタイムゾーンIDと同じですか?

私はJodas現在のタイムゾーンを使用して、この時に更新されていないことに気づい: DateTimeZone.getDefault()

私はJavaのデフォルトTimeZone.getDefault()を使用する場合は、タイムゾーンが正しいです。

注意:もう一度変更すると、Jodaの値は以前に変更されています。だから、Androidがブロードキャストインテントを起動したときにまだ更新されていません。

私は現在のタイムゾーンにJavaタイムゾーンのみを使用できます。しかし、私のドメインオブジェクトは、Joda DateTimeZone`sを使用しています。今私は現在のタイムゾーンと私のドメインオブジェクト内のタイムゾーンを比較したいと思います。これを行うには保存されますか:

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

? 2つのライブラリでタイムゾーンIDが異なる場合がありますか?

+0

さらに詳しい回答が必要な場合は、問題に特定の値を含めるように質問を編集してください。 –

答えて

5

TL; DRは

いいえ、安全でない時間帯を想定する:

  • が存在します。
  • には、特定の識別子が定義されています。
  • には同じ定義/規則があります。

のtzdata

ほとんどのオペレーティングシステムとソフトウェアライブラリは、現在および過去のタイムゾーン情報を提供するためにIANAによって維持tz databaseに依存しています。 tzdataまたはTZDBとも呼ばれます。以前はオルソンデータベースとして知られていました。世界中で

頻繁に変更

政治家はしばしば、を変更し再定義、再スケジュール、名前の変更、およびそれ以外の時間帯の定義とルールをいじりを楽しみます。彼らはしばしば2ヵ月弱の今のところ、Turkey(2016年の秋)のように、あまり予告せずにそうする。

新しいタイムゾーンが定義されることがあります。したがって、あなたの質問に具体的に答えるには:はい、いくつかのコピーのtzdataに古いコピーには存在しない新しいタイムゾーン定義があるかもしれないので、タイムゾーン識別子の違いがあります。

また、既存のタイムゾーンに新しい名前が付けられることもあります。たとえば、最近インドで都市名を復元すると、Asia/Calcuttaにはというラベルも付いています。再び、古いtzdataのコピーはこの新しい名前を知らないでしょう。

は、America/MontrealAfrica/Casablanca、又はPacific/Aucklandとして、continent/regionの形式でproper time zone nameを指定します。 ESTまたはISTのような3〜4文字の略語は、ではなく、のように、標準化されておらず、ユニークではない(!)と使用しないでください。

ソフトウェアによっては、これらの疑似時間ゾーンを認識しようとするためにtzdataが拡張されます。いい考えではない。しかし、これもまた、これらの非標準のタイムゾーン識別子を使用することは、ある場所では動作しますが、別の場所では動作しないことを意味します。公式のタイムゾーン名をつけてください。

一部のゾーンはdisplay nameBritish Timeなど)です。しかし、は決してを識別子として使用してください。

システム管理者は、それが使用されるかもしれないすべての様々な場所でのtzdataを更新するための努力をしなければならない更新

  • オペレーティングシステム
  • Java仮想マシン
  • ソフトウェアライブラリを(例えばJoda-Timeとして、おそらくThreeTen-Backport)。

JVMのプロバイダには、通常、最新バージョンのtzdataがJVMのアップデートに含まれています。しかし、政治家は、Javaのアップデートよりもタイムゾーンを頻繁に変えています。したがって、JVMを手動で更新する必要があるかもしれません。オラクル社は、 OpenJDK JVM用にTimezone Update ToolをOracleに提供しています。

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); 
関連する問題