2015-02-01 12 views
16

Per quanto ho potuto ricercare, UTC e Zulu sono gli stessi. Comunque sto correndo in difficoltà confrontando due ZonedDateTimes che ricevo da diverse fonti nel mio codice. Il codice seguente illustra il problema:uguaglianza Java 8 del tempo UTC e Zulu?

@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 
} 

Il problema:

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

e quale sarà il modo corretto per creare e confrontare i valori basati UTC, allora?

Secondo W3C Date and Time Formats:

gli orari sono espressi in UTC (Coordinated Universal Time), con uno speciale designatore UTC ("Z").

risposta

19

Secondo il codice sorgente, ZonedDateTime.equals utilizza ZoneId.equals per confrontare la componente zona di id, e che a sua volta confronta gli ID piuttosto che gli offset.

Se volete due ZonedDateTime con "diversi ma equivalenti" id di zona per confrontare come uguali, è necessario creare loro come questo:

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()); 

Credo che questo sia un caso in cui le vostre aspettative (sulla base del W3C documentazione per le rappresentazioni di stringa) non corrispondono alla semantica documentata delle classi Java. In questi casi, il javadoc è definitivo.

(Questo non è un bug Java 8, IMO.)

+0

Un'altra opzione è quella di convertire ogni ZonedDateTime per un istante, come i due istanti saranno uguali. – VGR

+0

Sì ... se è quello che stai cercando di ottenere. –

Problemi correlati