UTC 参考时间地球上最早和最新的 ZonedDateTimes
Earliest and Latest ZonedDateTimes on Earth from an UTC reference time
我有一个 UTC 的 ZonedDateTime 参考:
var ref = ZonedDateTime.parse("2022-01-01T14:00Z");
我们必须根据最极端的已知时区找到地球上最早和最晚的时间。
那就是:
2022-01-02T04:00+14
2022-01-01T03:00-11
实现此目的最可靠的方法是什么?
我正在考虑 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 在贝克岛和豪兰岛进行了技术观察。
我有一个 UTC 的 ZonedDateTime 参考:
var ref = ZonedDateTime.parse("2022-01-01T14:00Z");
我们必须根据最极端的已知时区找到地球上最早和最晚的时间。
那就是:
2022-01-02T04:00+14
2022-01-01T03:00-11
实现此目的最可靠的方法是什么?
我正在考虑 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 在贝克岛和豪兰岛进行了技术观察。