どして
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
false
を印刷しますか?
両方のZonedDateTime
インスタンスが等しくなることを期待します。
答えは ZoneId
のjavadoc (私の強調)から来ています...
ZoneIdは、InstantとLocalDateTimeの間の変換に使用される規則を識別するために使用されます。 IDには2つの異なるタイプがあります。
- 固定オフセット - UTC /グリニッジ標準時からの完全に解決されたオフセット。すべてのローカル日時に同じオフセットを使用します。
- 地理的地域 - UTC /グリニッジからのオフセットを見つけるための特定の一連の規則が適用される領域
ほとんどの固定オフセットはZoneOffsetで表されます。 任意のZoneIdでNormalized()を呼び出すと、固定オフセットIDがZoneOffsetとして表されるようになります。
...そして ZoneId#of
のjavadoc (私の強調)から:
このメソッドはIDを解析してZoneIdまたはZoneOffsetを生成します。 IDが 'Z'の場合、または '+'または ' - 'で始まる場合はZoneOffsetが返されます。
引数idは"UTC"
として指定されているため、オフセット付きのZoneId
を返します。これも文字列形式で表示されます。
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));
出力:
2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]
比較にequals
メソッドを使用すると、オブジェクトの等価性を確認するとなります。説明されている違いのため、評価の結果はfalse
です。
ドキュメントで提案されているように normalized()
メソッドが使用されている場合、normalized()
は対応するequals
を返すので、true
を使った比較はZoneOffset
を返します。
タイムゾーンIDを正規化し、可能な場合はZoneOffsetを返します。
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
ドキュメントが述べているように、"Z"
または"+0"
を入力IDとして使用する場合、of
は直接ZoneOffset
を返すので、normalized()
を呼び出す必要はありません。
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
同じ日付時刻を格納している場合を確認するには、代わりに isEqual
メソッドを使用します。
now.withZoneSameInstant(ZoneOffset.UTC)
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true
サンプル
System.out.println("equals - ZoneId.of(\"UTC\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
System.out.println("equals - ZoneId.of(\"UTC\").normalized(): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())));
System.out.println("equals - ZoneId.of(\"Z\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("Z"))));
System.out.println("equals - ZoneId.of(\"+0\"): " + nowZoneOffset
.equals(now.withZoneSameInstant(ZoneId.of("+0"))));
System.out.println("isEqual - ZoneId.of(\"UTC\"): "+ nowZoneOffset
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))));
出力:
equals - ZoneId.of("UTC"): false
equals - ZoneId.of("UTC").normalized(): true
equals - ZoneId.of("Z"): true
equals - ZoneId.of("+0"): true
isEqual - ZoneId.of("UTC"): true