【问题标题】:OffsetDateTime invalid formatOffsetDateTime 格式无效
【发布时间】:2020-07-23 11:31:25
【问题描述】:

我尝试获取一个包含 zoneDateTime 值的字符串。

ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String date = "2019-06-12T22:00:00-04:00";
OffsetDateTime odt = objectMapper.readValue(date, OffsetDateTime.class);
System.out.println(odt);

Jackson 说:parserException: 意外字符-

此命令有效

OffsetDateTime.parse("2019-06-12T22:00:00-04:00"); 

所以看起来像杰克逊问题

【问题讨论】:

  • 从这个answer,我猜你的问题是你在date 字符串中使用了字符'-'。你的小时和分钟应该用':'分隔
  • 字符串中的时间:22:00:00
  • @DavidBuzatu 是一个偏移日期时间字符串。这意味着 -04:00 是与 UTC 的偏移量。

标签: java jackson


【解决方案1】:

objectMapper.readValue(date, OffsetDateTime.class) 期望字符串 date 是有效的 JSON。

因此,使用它的一种方法是从以下示例开始:

String json = "{ \"odt\" : \"2019-06-12T22:00:00-04:00\" }";

然后创建一个对象来存储这个JSON,例如:

import java.time.OffsetDateTime;

public class ODT {

    private OffsetDateTime odt;

    public OffsetDateTime getOdt() {
        return odt;
    }

    public void setOdt(OffsetDateTime odt) {
        this.odt = odt;
    }
    
}

现在,以下代码将使用您的对象映射器成功处理输入:

ODT myOdt = objectMapper.readValue(json, ODT.class);
System.out.println(myOdt.getOdt());

打印出来:

2019-06-13T02:00Z

更新

要使用原始偏移量而不是 UTC 显示此值,您可以使用以下命令:

System.out.println(myOdt.getOdt().atZoneSameInstant(ZoneId.of("-04:00")));

打印出来:

2019-06-12T22:00-04:00

这与我们的起始 JSON 字符串中的原始值相同。

【讨论】:

  • 本地,我有纽约时​​间。 zone.. 所以 -4 我预计会得到 2019-06-12T18:00
  • 了解 - 我已更新我的答案以涵盖您的观点(但应该是 22:00 而不是 18:00,对吧?)。由于原始时间是 -04:00 偏移量中的 22:00,因此将是 UTC 时间的第二天 02:00(如我最初的答案所示)。因此,重新调整此偏移量的显示字符串会使我们回到开始时间。希望这是有道理的。
猜你喜欢
  • 2021-03-10
  • 2017-08-09
  • 2017-05-14
  • 2017-06-12
  • 2014-08-15
  • 1970-01-01
  • 2015-01-22
  • 2020-08-16
  • 2010-10-31
相关资源
最近更新 更多