使用java.time
软件包:
我将用户输入的自由插入的日期时间(年,月,日,小时,分钟)转换为LocalDateTime
,然后根据用户的时区转换为{{3 }}。
爱沙尼亚示例:
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日结束。在格林尼治标准时间+3的04:00,时钟已更改为格林尼治标准时间+2的03:00,这意味着当天凌晨03:30到达了两次。根据{{3}},转换的最终时间是夏令时03:30 GMT + 3(强调我的时间):
在大多数情况下,本地日期时间只有一个有效偏移量。在重叠的情况下,如果将时钟调回,则有两个有效的偏移量。 此方法使用通常对应于“夏季”的更早偏移量。
我希望此转换不能隐式执行。相反,我想捕获一个异常并通知用户有关模棱两可的输入。似乎有一种方法可以做到这一点,但我不明白的是为什么该方法是静态的并接受三个参数。如何针对我的情况正确使用它?来自同一文档:
要在出现间隙或重叠时引发异常,请使用
ZonedDateTime.ofStrict(LocalDateTime, ZoneOffset, ZoneId)
。
为什么要求一个ZoneOffset
参数?在我看来,我只需要一个LocalDateTime
和ZoneId
。否则,每次转换为ZonedDateTime
时,如何知道使用GMT + 2还是GMT + 3的偏移量?我想让Java告诉我这件事,或者如果两者都适用,则抛出异常。
答案 0 :(得分:0)
我找到了the answer,并将自己的问题标记为重复。
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)