他の人が説明したように、そこには時間の不連続があります。1927-12-31 23:54:08
at Asia/Shanghai
には2つの可能なタイムゾーンオフセットがありますが、のオフセットは1つだけです1927-12-31 23:54:07
。したがって、使用されるオフセットに応じて、1秒の差または5分53秒の差があります。
通常の1時間の夏時間(夏時間)の代わりに、このオフセットのわずかなシフトにより、問題が少しわかりにくくなります。
タイムゾーンデータベースの2013aの更新により、この不連続性が数秒早く移動しましたが、その影響はまだ観察可能です。
java.time
Java 8 の新しいパッケージは、これをより明確に見て、それを処理するためのツールを提供します。与えられた:
DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.append(DateTimeFormatter.ISO_LOCAL_DATE);
dtfb.appendLiteral(' ');
dtfb.append(DateTimeFormatter.ISO_LOCAL_TIME);
DateTimeFormatter dtf = dtfb.toFormatter();
ZoneId shanghai = ZoneId.of("Asia/Shanghai");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
ZonedDateTime zdt3 = LocalDateTime.parse(str3, dtf).atZone(shanghai);
ZonedDateTime zdt4 = LocalDateTime.parse(str4, dtf).atZone(shanghai);
Duration durationAtEarlierOffset = Duration.between(zdt3.withEarlierOffsetAtOverlap(), zdt4.withEarlierOffsetAtOverlap());
Duration durationAtLaterOffset = Duration.between(zdt3.withLaterOffsetAtOverlap(), zdt4.withLaterOffsetAtOverlap());
その後durationAtEarlierOffset
は1秒、durationAtLaterOffset
5分53秒になります。
また、これらの2つのオフセットは同じです。
// Both have offsets +08:05:52
ZoneOffset zo3Earlier = zdt3.withEarlierOffsetAtOverlap().getOffset();
ZoneOffset zo3Later = zdt3.withLaterOffsetAtOverlap().getOffset();
しかし、これら2つは異なります。
// +08:05:52
ZoneOffset zo4Earlier = zdt4.withEarlierOffsetAtOverlap().getOffset();
// +08:00
ZoneOffset zo4Later = zdt4.withLaterOffsetAtOverlap().getOffset();
同じ問題がと比較1927-12-31 23:59:59
してわかりますが1928-01-01 00:00:00
、この場合、より長い発散を生じるのはより早いオフセットであり、2つの可能なオフセットがあるのはより早い日付です。
これにアプローチする別の方法は、進行中の移行があるかどうかを確認することです。これは次のようにして行うことができます。
// Null
ZoneOffsetTransition zot3 = shanghai.getRules().getTransition(ld3.toLocalDateTime);
// An overlap transition
ZoneOffsetTransition zot4 = shanghai.getRules().getTransition(ld3.toLocalDateTime);
isOverlap()
とisGap()
メソッドを使用することにより、その日付/時刻に有効なオフセットが複数あるオーバーラップ、またはそのゾーンIDにその日付/時刻が有効でないギャップがある遷移が遷移であるかどうかを確認できzot4
ます。
これが、Java 8が広く利用可能になったとき、またはJSR 310バックポートを採用するJava 7を使用する人々がこの種の問題を処理するのに役立つことを願っています。