2015-02-01 6 views
16

Soweit ich recherchieren konnte, sind UTC und Zulu gleich. Allerdings habe ich Schwierigkeiten, zwei von verschiedenen Quellen in meinem Code empfangene "ZonedDateTimes" zu vergleichen. Der folgende Code zeigt das Problem:Java 8 Gleichheit von UTC und Zulu Zeit?

@Test 
public void equalsOnTimezone() throws Exception { 
    ZonedDateTime zdtUtc = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("UTC")); 
    ZonedDateTime zdtZ = ZonedDateTime.of(2015, 2, 1, 14, 30, 0, 0, ZoneId.of("Z")); 
    assertEquals(zdtUtc, zdtZ); // will fail 
} 

Das Problem:

java.lang.AssertionError: expected:<2015-02-01T14:30Z[UTC]> but was:<2015-02-01T14:30Z> 

Und was ist der richtige Weg sein, zu erstellen und zu UTC läuft Werte vergleichen dann?

Laut W3C Date and Time Formats:

Zeiten in UTC ausgedrückt werden (Coordinated Universal Time), mit einem speziellen UTC Bezeichner ("Z").

Antwort

19

Nach dem Quellcode verwendet ZonedDateTime.equalsZoneId.equals die Zonen-ID-Komponente zu vergleichen, und das wiederum vergleicht die IDs nicht die Offsets.

Wenn Sie zwei ZonedDateTime wollen mit „unterschiedlichen, aber gleichwertig“ Zone-IDs als gleich zu vergleichen, sollten Sie sie wie folgt erstellen:

ZonedDateTime zdtUtc = ZonedDateTime.of(
    2015, 2, 1, 14, 30, 0, 0, ZoneId.of("UTC").normalized()); 
ZonedDateTime zdtZ = ZonedDateTime.of(
    2015, 2, 1, 14, 30, 0, 0, ZoneId.of("Z").normalized()); 

Ich denke, dies ist ein Fall, wo Ihre Erwartungen (auf Basis des W3C Dokumentation für die String-Darstellungen) entsprechen nicht der dokumentierten Semantik der Java-Klassen. In solchen Fällen ist das Javadoc endgültig.

(Dies ist eine Java 8 Fehler NOT, IMO.)

+0

Eine weitere Option ist es, jede ZonedDateTime zu einem Instant zu konvertieren, da die beiden Instants gleich sein wird. – VGR

+0

Ja ... wenn Sie das erreichen wollen. –