2017-11-15 8 views
1

私はJoda-Timeを使用するプロジェクトの単体テストに取り組んでおり、同じタイムゾーンを表すDateTimeZoneインスタンスがequalsでtrueを返していないことに気付きました。確認この下実際には、二つの試験 - 特に、両方のテストがAfrica/LagosGMT+01:00は、同じ時間帯であっても失敗すると、2つのDateTimesが同じ瞬間を表すJoda-Time DateTimeZoneが正しく比較されない

// should be the same 
DateTimeZone WAT = DateTimeZone.forOffsetHours(1); // GMT+01:00 
DateTimeZone LAG = DateTimeZone.forID("Africa/Lagos"); // Lagos 

DateTime sample = new DateTime(2017, 11, 15, 10, 50); 
DateTime dtzWAT = sample.withZoneRetainFields(WAT); 
DateTime dtzLAG = sample.withZoneRetainFields(LAG); 

@Test public void compareZones() { assertEquals(WAT, LAG); } 
@Test public void compareTimes() { assertEquals(dtzWAT, dtzLAG); } 

以下このようなユニットテストに

// both succeed 
@Test public void compareStrings() { 
    assertEquals(dtzWAT.toString(), dtzLAG.toString()); 
} 

@Test public void checkSameTime() { 
    assertFalse(dtzLAG.isBefore(dtzWAT)); 
    assertFalse(dtzWAT.isBefore(dtzLAG)); 
} 

どうしてですか? 2つのタイムゾーンインスタンスが同じでない理由は何ですか。どんな助けもありがとう。

+0

"この問題を回避する方法はありますか?実際にどのような問題を解決しようとしていますか? –

+0

@AndyTurner DateTimeインスタンスを同じにする方法が必要です。私は彼らが事実上同等であることを知っていますが、私はこれを 'equals'メソッドに反映する必要があります。 –

+0

しかし、どの意味で同等ですか?同じ瞬間(Unixエポックと同じオフセット)を参照するようにしたい場合は、 '.toInstant()'を使って 'Instant'に変換してから比較してください(あるいは'!a.isAfter(b)&& !b.isAfter(a) 'または' a.compareTo(b)== 0'ですが、これは 'equals'と矛盾しています)。 –

答えて

1

なぜこれが

が起こるんDateTimeZone sが等しくない:1がAfrica/Lagosと呼ばれ、他はGMT+01:00です。

ベースの平等のために指定されたオブジェクトとこのオブジェクトを比較:ID、すべての内部ルール

そしてDateTime.equalsのために基づいてthe Javadoc of DateTimeZone.equals

等しい場合はtrue、が、それは述べていますミリ秒の瞬時に、年表およびタイムゾーン

タイムゾーンが等しくないため、DateTimeは等しくありません。

おそらく彼らは、効果的等しく、実際に彼らはているわけではありません。

java.util.TimeZoneには、hasSameRules(...)というメソッドがあります。これは、等価とは別の概念です。

関連する問題