다른 사람들이 설명했듯이 시간 불연속이 있습니다. 1927-12-31 23:54:08
at Asia/Shanghai
에 대해 두 개의 가능한 시간대 오프셋이 있지만에 대한 하나의 오프셋 만 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 초가됩니다.
또한이 두 오프셋은 동일합니다.
// Both have offsets +08:05:52
ZoneOffset zo3Earlier = zdt3.withEarlierOffsetAtOverlap().getOffset();
ZoneOffset zo3Later = zdt3.withLaterOffsetAtOverlap().getOffset();
그러나이 두 가지는 다릅니다.
// +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
하지만,이 경우는 이전에 더 이상 차이를 생산하는 오프셋, 그것은 두 가지 오프셋을 가지고 이전 날짜입니다.
이에 접근하는 또 다른 방법은 전환이 진행 중인지 확인하는 것입니다. 우리는 이렇게 할 수 있습니다 :
// 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을 사용하는 사람들이 이런 종류의 문제를 처리하는 데 도움이되기를 바랍니다.