无法从TemporalAccessor获取OffsetDateTime
当我这样做时
String datum = "20130419233512";DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime datetime = OffsetDateTime.parse(datum, formatter);
我得到以下异常:
java.time.format.DateTimeParseException: Text '20130419233512' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {InstantSeconds=1366407312},ISO,Europe/Berlin resolved
to 2013-04-19T23:35:12 of type java.time.format.Parsed
如何解析日期时间字符串,以便将其始终解释为来自“欧洲/柏林”时区?
回答:
问题在于,a ZoneIdis
和a ZoneOffsetis
之间存在差异。要创建一个OffsetDateTime
,您需要一个区域偏移量。但是,aZoneId
和a之间没有一对一的映射关系,ZoneOffset
因为它实际上取决于当前的夏时制时间。对于ZoneId像“欧洲/柏林”一样的商品,夏季有一个偏移量,而冬季有一个不同的偏移量。
在这种情况下,使用aZonedDateTime
代替会更容易OffsetDateTime
。在解析期间,ZonedDateTime
将正确设置为"Europe/Berlin"
区域ID,并且还会根据要解析的日期有效的夏时制设置偏移量:
public static void main(String[] args) { String datum = "20130419233512";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin"));
ZonedDateTime datetime = ZonedDateTime.parse(datum, formatter);
System.out.println(datetime.getZone()); // prints "Europe/Berlin"
System.out.println(datetime.getOffset()); // prints "+02:00" (for this time of year)
}
请注意,如果您确实要使用OffsetDateTime,可以使用ZonedDateTime.toOffsetDateTime()
将转换ZonedDateTime
为OffsetDateTime
。
以上是 无法从TemporalAccessor获取OffsetDateTime 的全部内容, 来源链接: utcz.com/qa/408959.html