UTC 参考时间地球上最早和最新的 ZonedDateTimes

Earliest and Latest ZonedDateTimes on Earth from an UTC reference time

我有一个 UTC 的 ZonedDateTime 参考:

var ref = ZonedDateTime.parse("2022-01-01T14:00Z");

我们必须根据最极端的已知时区找到地球上最早和最晚的时间。

那就是:

实现此目的最可靠的方法是什么?

我正在考虑 OffsetDateTime,但我不确定它能否正确处理夏令时。是否有最小和最大偏移量的常量 and/or TZ?

您可以在 ZoneId.getAvailableZoneIds() 上直播。

var instant = Instant.parse("2022-01-01T14:00:00Z");
var minMax = ZoneId.getAvailableZoneIds().stream()
    .mapToInt(x -> ZoneId.of(x).getRules().getOffset(instant).getTotalSeconds())
    .summaryStatistics();

var latestLocalTime = instant.atOffset(ZoneOffset.ofTotalSeconds(minMax.getMax())).toLocalDateTime();
var earliestLocalTime = instant.atOffset(ZoneOffset.ofTotalSeconds(minMax.getMin())).toLocalDateTime();
System.out.println(latestLocalTime);
System.out.println(earliestLocalTime);

请注意,这会在 Java 17:

中打印出来
2022-01-02T04:00
2022-01-01T02:00

最早的时间和你想象的不一样。我查看了这个时区:

System.out.println(ZoneId.getAvailableZoneIds().stream()
    .map(ZoneId::of).min(Comparator.comparingInt(
        x -> x.getRules().getOffset(instant).getTotalSeconds()
    )));

显然是时区 Etc/GMT+12。尽管有标识符,这个时区实际上有 -12 小时的偏移量,因为 Etc/GMT 标识符使用相反的符号。无论如何,根据维基百科,UTC-12 在贝克岛和豪兰岛进行了技术观察。