如果是时区的模棱两可的日期时间,则抛出例外



使用java.time软件包:

我将自由插入日期时间(年,月,日,小时,分钟)的用户输入转换为LocalDateTime,然后根据用户的时区,转换为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时,时钟被更改为格林尼治标准时间03:00,这意味着那天到达两次的时间03:30。根据atZone()的文档,转换的结果时间是夏季时间03:30 GMT 3(重点是我的):

在大多数情况下,本地日期时间只有一个有效偏移。如果是重叠的时钟,则有两个有效的偏移。此方法使用较早的偏移通常与"夏季"相对应。

我想要的是这种转换不要被隐式执行。取而代之的是,我想捕获一个异常,并告知用户有关模棱两可的输入。似乎有一种方法可以做到这一点,但是我不明白的是为什么该方法是静态的,并且接受三个论点。如何正确使用我的情况?从同一文档中:

在存在差距或重叠时,要引发异常,请使用ZonedDateTime.ofStrict(LocalDateTime, ZoneOffset, ZoneId)

为什么要求ZoneOffset参数?在我看来,我只需要LocalDateTimeZoneId。否则,每次转换为ZonedDateTime时,我如何知道是否使用GMT 2或GMT 3的偏移?这是我希望Java告诉我或不适用的例外。

我找到了答案,并将自己的问题标记为重复。

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)

相关内容

  • 没有找到相关文章

最新更新