使用java.time包:我正在将自由插入的日期时间(年、月、日、小时、分钟)的用户输入转换为 a LocalDateTime,然后根据用户的时区转换为 a ZonedDateTime。爱沙尼亚的例子:LocalDateTime local = LocalDateTime.of(2018, 10, 28, 3, 30); // October 28th 03:30
ZonedDateTime zoned = local.atZone(ZoneId.of("Europe/Tallinn"));上述时间 03:30 可能意味着时间线上的两个实例,因为 2018 年 10 月 28 日,爱沙尼亚的夏令时结束。在 04:00 GMT+3 时,时钟更改为 03:00 GMT+2,这意味着当天两次到达 03:30。根据的文档atZone(),转换的结果时间是夏令时 03:30 GMT+3(强调我的):在大多数情况下,本地日期时间只有一个有效偏移量。在重叠的情况下,时钟被调回,有两个有效的偏移量。此方法使用通常对应于“夏季”的较早偏移量。我想要的是不要隐式地进行这种转换。相反,我想捕获一个异常并通知用户有关不明确的输入。似乎有一种方法可以做到这一点,但我不明白为什么该方法是静态的并接受三个参数。如何在我的情况下正确使用它?来自相同的文档:要在存在间隙或重叠时引发异常,请使用ZonedDateTime.ofStrict(LocalDateTime, ZoneOffset, ZoneId).为什么它要求ZoneOffset争论?在我看来,我所需要的只是一个LocalDateTimeand ZoneId。否则,每次转换为ZonedDateTime,我怎么知道是使用 GMT+2 还是 GMT+3 的偏移量?这是我希望 Java 告诉我的事情,或者如果两者都适用则抛出异常。
1 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
我找到了答案并将我自己的问题标记为重复。
ZoneId zoneId = ZoneId.of("America/Chicago");
LocalDateTime ldt = LocalDateTime.of(2017, 3, 12, 2, 39, 0, 0);
ZoneOffset zoneOffset = zoneId.getRules().getOffset(ldt);
ZonedDateTime zdt = ZonedDateTime.ofStrict(ldt, zoneOffset, zoneId);
会扔
Exception in thread "main" java.time.DateTimeException: LocalDateTime '2017-03-12T02:39' does not exist in zone 'America/Chicago' due to a gap in the local time-line, typically caused by daylight savings
at java.time.ZonedDateTime.ofStrict(ZonedDateTime.java:484)
添加回答
举报
0/150
提交
取消