私が調査できる限り、UTCとズールーは同じです。しかし、コードの異なるソースから受け取った2つのZonedDateTimeを比較するのは困難です。次のコードは問題を示しています。
@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
}
問題:
Java.lang.AssertionError: expected:<2015-02-01T14:30Z[UTC]> but was:<2015-02-01T14:30Z>
そして、UTCベースの値を作成して比較する正しい方法は何でしょうか?
W3Cによると 日付と時刻の形式 :
時間は、特別なUTC指定子( "Z")を付けて、UTC(協定世界時)で表されます。
ソースコードによると、ZonedDateTime.equals
はZoneId.equals
を使用してゾーンIDコンポーネントを比較し、次に、オフセットではなくIDを比較します。
「異なるが同等の」ゾーンIDを持つ2つのZonedDateTimeを等しいものとして比較する場合は、次のように作成する必要があります。
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());
これは、(文字列表現に関するW3Cのドキュメントに基づく)期待がJavaクラスのドキュメント化されたセマンティクスに対応していない場合です。そのような場合、javadocが決定的です。
(これはJava 8バグ、IMOではありません。)