2017年3月12日02:39:00“美国/芝加哥”
不存在。当我将日期和时间设置为该值时,它不会失败。时间设置为一小时后的2017年3月12日03:39:00。如何才能通知我这一时间不存在。时间是这样向前跳跃的
01:59:59
3:00:00
如您所见,< code>02:39:00在这个日期永远不会存在。
这是我正在使用的代码
package com.company;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
ZoneId zoneId = ZoneId.of("America/Chicago");
ZonedDateTime dateTimeStart = ZonedDateTime.of(2017, 1, 1, 15, 39, 0, 0, ZoneId.of("America/Chicago"));
ZonedDateTime dateTimeStartUtc = dateTimeStart.withZoneSameInstant(ZoneOffset.UTC);
ZoneId zoneIdDst = ZoneId.of("America/Chicago");
ZonedDateTime dateTimeStartDst = ZonedDateTime.of(2017, 3, 12, 2, 39, 0, 0, ZoneId.of("America/Chicago"));
ZonedDateTime dateTimeStartUtcDst = dateTimeStart.withZoneSameInstant(ZoneOffset.UTC);
int y = 90;
}
}
您的示例没有引发异常,因为< code>ZonedDateTime.of(..)调整日期时间。javadoc声明
这将创建与输入的本地日期时间尽可能接近的分区日期时间。时区规则(如夏令时)意味着并非每个本地日期时间对指定区域都有效,因此可以调整本地日期时间。
您可以使用 ZonedDateTime#ofStrict(LocalDateTime、ZoneOffset、ZoneId)
来执行验证。
获取ZonedDateTime的实例,严格验证本地日期时间、偏移量和区域ID的组合。
这将创建分区的日期时间,确保根据指定区域的规则,偏移量对于本地日期时间有效。如果偏移量无效,将引发异常。
您首先需要构造一个< code>LocalDateTime。然后,您将获得该本地日期时间的< code>ZoneId的< code>ZoneOffset。然后,您可以将这三者都提供给< code>ofStrict。
举个例子,
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)
这里有一个没有抛出异常的验证。您只需要询问区域规则LocalDateTime
是否在给定时区内有效:
public static boolean isValid(LocalDateTime ldt, ZoneId zoneId) {
return !zoneId.getRules().getValidOffsets(ldt).isEmpty();
}