16

2 つの ZonedDateTime オブジェクトを作成しましたが、それらは等しいはずです。

public static void main(String[] args) {
    ZoneId zid = ZoneId.of("America/New_York");
    ZoneOffset offset = ZoneOffset.from(LocalDateTime.now().atZone(zid));
    ZonedDateTime zdt0 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, offset);
    ZonedDateTime zdt1 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, zid);
    boolean equals = Objects.equals(zdt0, zdt1);
    System.out.println("equals: " + equals);
}

デバッガーでは、最初のケースの ZonedDateTimeゾーンのメンバーのクラスがjava.time.ZoneOffsetであり、2 番目の java.time.ZoneRegion であることがわかります。これにより、ZonedDateTime オブジェクトが等しくなくなります。これは紛らわしいです...何かアイデアはありますか?

4

4 に答える 4

30

falseこれらのオブジェクトが同等ではないため、オブジェクトの同等性をチェックしています。1 つは にバインドされ、もう 1 つは にバインドされZoneIdますZoneOffset。それらが同じ時間を表しているかどうかを確認したい場合は、あまり直感的に名前が付けられていないメソッドを使用できますisEqual

例えば:

ZoneId zid = ZoneId.of("America/New_York");
ZoneOffset offset = ZoneOffset.from(LocalDateTime.now().atZone(zid));
ZonedDateTime zdt0 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, offset);
ZonedDateTime zdt1 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, zid);
System.out.println("isEqual:" + zdt0.isEqual(zdt1));
System.out.println("equals: " + zdt0.equals(zdt1));

プリント:

isEqual:true
equals: false

Objects.equals(a,b)ところで、すでに非であることがわかっている 2 つのオブジェクトに対して使用する必要はないことに注意してくださいnull。直接呼び出すことができa.equals(b)ます。

于 2014-09-11T18:09:12.157 に答える
2

equals()メソッド onでは、オブジェクトのZonedDateTimeすべてのコンポーネント パーツが等しい必要があります。aZoneOffsetは a と等しくないためZoneRegion(どちらも のサブクラスですがZoneId)、メソッドは false を返します。VALJOについて読んで、値の型がこのように比較される理由を理解してください。

このisEqualメソッドは、タイムライン上の瞬間のみを比較します。これは、必要なものである場合とそうでない場合があります。このtimeLineOrder() 方法ZoneDateTimeを使用して、タイムラインのみを使用して2 つを比較することもできます。

于 2014-09-11T18:59:14.377 に答える