如何解决Java8 Instant?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (1757)

我正在尝试使用Jackson将ISO8601格式的日期反序列化为Java8 Instant。我使用ObjectMapper注册了JavaTimeModule,关闭了WRITE_DATES_AS_TIMESTAMPS。

但是,如果尝试反序列化2016-03-28T19:00:00.000 + 01:00它将无法工作,因为似乎JavaTimeModule将仅反序列化使用UTC时区偏移格式化的日期时间(例如2016-03-28T18:00 :00.000Z)。然后我尝试使用@JsonFormat注释,如下所示:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "UTC")

像这样:

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = JsonFormat.DEFAULT_TIMEZONE)

但是,这些都不起作用,我得到一个例外:

com.fasterxml.jackson.databind.JsonMappingException: Unsupported field: YearOfEra (through reference chain: org.example.Article["date"])

这意味着时区参数被忽略,日期时间格式化程序不知道如何在没有时区的情况下格式化Instant。

有没有办法在没有编写自定义反序列化器的情况下,使用Jackson和JavaTimeModule将不在UTC时区偏移的ISO8601字符串反序列化为Java 8 Instant?

提问于
用户回答回答于

格式“Z”不适用于“+01:00”,因为这是一种不同的模式。JsonFormat正在使用SimpleDateFormat模式。大写的 “Z” 仅表示严格的RFC 822.您必须使用如下语法:“+ 0100”,不带冒号。

请参阅:ISO 8601:2004SimpleDateFormat模式

用户回答回答于

如果要将Date对象序列化为ISO-8601,则根本不需要指定模式 - ISO-8601是默认模式。它在JsonFormatJava文档中提到:

常见用途包括在备用表示之间进行选择 - 例如,将Date序列化为数字(Java时间戳)还是字符串(例如ISO-8601兼容时间值) - 以及使用pattern()属性配置精确详细信息。

[emphasisasis mine]你应该从上面的文字中理解,指定shape = STRING意味着ISO-8601格式,但你可以使用该pattern属性选择其他东西。

根据我的经验,这总是生成一种UTC日期格式(时区呈现为+0000),这可能是我的VM中的默认时区(即使我的操作系统时钟未设置为UTC)。

扫码关注云+社区

领取腾讯云代金券