我有一个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在贝克岛和豪兰岛都有观测到。