首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从TemporalAccessor获取OffsetDateTime

无法从TemporalAccessor获取OffsetDateTime
EN

Stack Overflow用户
提问于 2016-02-10 01:21:09
回答 2查看 19K关注 0票数 23

当我这样做的时候

代码语言:javascript
复制
String datum = "20130419233512";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime datetime = OffsetDateTime.parse(datum, formatter);

我得到了以下异常:

代码语言:javascript
复制
    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

我如何解析我的datetime字符串,以便它总是被解释为来自时区“欧洲/柏林”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-10 01:35:43

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

对于这种情况,使用ZonedDateTime比使用OffsetDateTime更容易。在解析过程中,ZonedDateTime将被正确设置为"Europe/Berlin"区域id,偏移量也将根据要解析的日期的生效夏令时设置:

代码语言:javascript
复制
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

票数 22
EN

Stack Overflow用户

发布于 2016-02-10 01:31:18

源数据中没有偏移量,因此在解析过程中OffsetDateTime不是正确的类型。

相反,请使用LocalDateTime,因为它是与您拥有的数据最相似的类型。然后使用atZone为它分配一个时区,如果您仍然需要一个OffsetDateTime,可以从那里调用toOffsetDateTime

代码语言:javascript
复制
String datum = "20130419233512";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime datetime = LocalDateTime.parse(datum, formatter);
ZonedDateTime zoned = datetime.atZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime result = zoned.toOffsetDateTime();
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35298214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档