地球上UTC参考时间的最早和最晚分区日期时间



我有一个UTC中的参考ZonedDateTime:

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

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

那就是:

  • 2022-01-02T04:00+14
  • 2022-01-01T03:00-11

实现这一目标最可靠的方法是什么?

我正在考虑OffsetDateTime,但我不确定它是否能正确处理夏令时。最小和最大偏移和/或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在贝克岛和豪兰岛都有观测到。

最新更新