使用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
参数?在我看来,我只需要LocalDateTime
和ZoneId
。否则,每次转换为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)