2017-03-02 13 views
0

2017-07-03T17:30:00-04:00などのタイムゾーン情報を含むタイムスタンプがあり、それをjava.Dateまたはjoda.DateTime。解析後のタイムスタンプにDateオブジェクトが含まれている場合、Dateオブジェクトにタイムゾーン情報が含まれています

タイムゾーン情報は含まれていますか? 私は2つの異なる日付インスタンスを比較したいので、これを尋ねています。だから、タイムゾーン情報が含まれていない場合、日差が

UPDATE異なるタイムゾーンを間違って次のようになります。 私はミリ秒に最初の変換日付インスタンス、検証するための簡単なユニットテストを実行し、これら2ミリ秒を減算した後バックするTimeUnitに変換します。あなたが使用DateTimeの種類に依存するように起こっている

+0

これらの2つのクラスのjavadocは何を表していますか? –

+0

私は日差を計算する方法に基づいて、最初にミリ秒に変換し、これらの2つの日付をミリ秒で比較する必要があると思います。しかし、私はクイックユニットテストを実行すると、それは私に異なるタイムゾーンで異なる時間を与える – Cheng

答えて

1

java.util.DateとJoda-Timeの両方がjava.timeクラスに置き換えられました。

入力文字列2017-07-03T17:30:00-04:00は、標準ISO 8601形式で、最後にUTCオフセットがあります。その-04:00は、文字列がUTCより4時間遅れた瞬間を表すことを意味します。

このオフセットはタイムゾーンではありません。タイムゾーンは、特定の地域のオフセットの履歴です。たとえば、America/BarbadosまたはAmerica/New_Yorkです。

文字列をjava.time.OffsetDateTimeオブジェクトとして解析します。

OffsetDateTime odt = OffsetDateTime.parse("2017-07-03T17:30:00-04:00"); 

odt.toString():2017-07-03T17:30:00-04:00

あなたは方法IsEqualisBefore、およびisAfterを呼び出すことによってOffsetDateTimeのインスタンスを比較することができます。

同じ時刻をUTCで表示するには、Instantを抽出します。

Instant instant = odt.toInstant() ; 

instant.toString():2017-07-03T21:30:00Z

端にZZuluの略であり、UTCを意味します。

0

時間は、Java 8のようこれらのオプションを持って、異なるタイムゾーンのために異なっている:

  • LocalDateまたはLocalDateTime。タイムゾーン情報は破棄されますが、ローカルのタイムゾーンでのみ有効な値が表示されます。この値は、値を生成したサーバープロセスの特定のタイムゾーンに関するコンテキストがないとあいまいです。
  • ZonedDateまたはZonedDateTime。これはタイムゾーンを維持します。比較は依然としてあいまいです.DSTやカレンダーの変更などの問題があります(互換性が必要な日時の範囲によって異なります)。並べ替え/比較の目的のために、それを参照タイムスケールに変換するのが望ましいでしょう。理由は次のとおりです。
  • Instantは、特定の瞬間をUTCの絶対時間スケールで表します。 Instantは他のInstantと直接比較でき、値のあいまいさはInstantの定義で解決されます。入力値はUTCで一致するものに変換されるため、絶対時間値が正しく保存されていても元のタイムゾーン(ある場合)が失われます。したがって、タイムゾーンを使用して場所やロケールを決定する場合は、Instantは適していません。
関連する問題