gpt4 book ai didi

java - 无法从 TemporalAccessor 获取 OffsetDateTime

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:58 29 4
gpt4 key购买 nike

当我这样做的时候

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

如何解析我的日期时间字符串,以便将其解释为始终来自时区“欧洲/柏林”?

最佳答案

问题是 ZoneIdZoneOffset 是有区别的。要创建 OffsetDateTime,您需要一个区域偏移量。但是there is no one-to-one mapping between a ZoneId and a ZoneOffset因为它实际上取决于当前的夏令时。对于像“Europe/Berlin”这样的相同 ZoneId,夏季有一个偏移量,冬季有一个不同的偏移量。

对于这种情况,使用 ZonedDateTime 而不是 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

关于java - 无法从 TemporalAccessor 获取 OffsetDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35298214/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com