ตามที่อธิบายโดยผู้อื่นมีเวลาไม่ต่อเนื่องที่นั่น มีสองชดเชยเขตเวลาที่เป็นไปได้สำหรับการ1927-12-31 23:54:08
ที่แต่เพียงหนึ่งชดเชยสำหรับAsia/Shanghai
1927-12-31 23:54:07
ดังนั้นขึ้นอยู่กับว่าใช้ออฟเซ็ตใดมีความแตกต่างหนึ่งวินาทีหรือ 5 นาทีและ 53 วินาที
การเปลี่ยนแปลงเล็กน้อยของการชดเชยนี้แทนที่จะใช้การประหยัดเวลากลางวันหนึ่งชั่วโมงปกติ (ฤดูร้อน) ที่เราคุ้นเคยเพื่อบดบังปัญหาเล็กน้อย
โปรดทราบว่าการอัปเดตฐานข้อมูลของเขตเวลา 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
จะเป็นหนึ่งวินาทีในขณะที่durationAtLaterOffset
จะเป็นห้านาทีและ 53 วินาที
นอกจากนี้ offsets สองแบบนี้เหมือนกัน:
// 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);
คุณสามารถตรวจสอบว่าการเปลี่ยนแปลงเป็นที่ทับซ้อนกันที่มีมากกว่าหนึ่งที่ถูกต้องชดเชยสำหรับวันที่ / เวลาหรือช่องว่างที่วันที่ / เวลาที่ไม่ถูกต้องสำหรับ ID โซนนั้น - โดยการใช้isOverlap()
และวิธีการเกี่ยวกับisGap()
zot4
ฉันหวังว่าสิ่งนี้จะช่วยให้ผู้ใช้จัดการกับปัญหาประเภทนี้ได้เมื่อ Java 8 พร้อมใช้งานอย่างกว้างขวางหรือสำหรับผู้ที่ใช้ Java 7 ซึ่งใช้ backport JSR 310