2013-06-18 8 views
25

ここで質問されているものと非常によく似た何か - compare Joda-Time time zonesを扱っていますが、それは私にとってはうまくいかないようです。 、私は上記の両方のSYSOUT文から「false」に取得興味深いことに2つのJoda-Time DateTimeオブジェクトの比較

DateTime estDT = new DateTime(DateTimeZone.forID("America/Puerto_Rico")).withMillisOfSecond(0); 
DateTime londonDT = new DateTime(DateTimeZone.forID("Europe/London")).withMillisOfSecond(0); 

    System.out.println("Comparison " + londonDT.isBefore(estDT)); 
    System.out.println("Comparison " + londonDT.isAfter(estDT)); 

-

は、ここで私はとJoda-TimeDateTimeをテストしていたコードの一部です。誰もこの比較を行う正しい方法が何であるか説明してください。

答えて

14

おそらく同じ瞬時を表していて、タイムゾーンが異なる2つのDateTimeインスタンスを作成しています。もう一方は前後どちらでもない。

タイムゾーンは、getHourOfDay()のような日付/時刻方法が瞬間をどのように変換するかにのみ影響します。

+1

に等しい技術的、londonDT宇宙のタイムライン上の点として* estDT後*モーメントを表します。コードの2つの別々の行は、コンピュータのクロックの2つの別々のサンプリングを意味するので、2番目の行は1番目より遅く発生しました。 DateTimeの分解能はミリ秒であるため、両方のコード行がコンピュータの時計と同じミリ秒以内に実行された場合、それらの行はお互いに等しくなります。これは純粋な運(チャンス)です。 Javaスレッドが実行中に遅延/中断したか、遅いコンピュータ上で実行されたかによって、その2つのDateTimesが異なる可能性があります。 –

+0

私たちは少し強すぎました。 withMillisOfSecond(0)を呼び出すと、2つの*はおそらく同じ瞬間を表します。ただし、別の秒で実行された場合(たとえば、ミリ秒= 999、ミリ秒= 0など)は異なる場合があります。同じ瞬間が実際に必要な場合は、瞬間を2回取得するよりも、withZone()メソッドが信頼性が高くなります。しかし、OPは入力として提供される時間内に2つの異なるインスタンスが必要になる可能性が高くなります。 –

44

isAfterおよびisBeforeの方法では、日付をミリ秒(タイムゾーンは無視)と比較します。

例では、日付はミリ秒に等しいです。

System.out.println(londonDT.getMillis() == estDT.getMillis()); 

は、trueを印刷します。

londonDT.isBefore(estDT) 
londonDT.isAfter(estDT) 

londonDT.getMillis() < estDT.getMillis() 
londonDT.getMillis() > estDT.getMillis() 
関連する問題