【发布时间】:2019-03-20 20:47:12
【问题描述】:
我正在使用 Spring Boot 中的 Rest API,我们正在使用出色的库 Joda Time。由于我的服务器配置为在 UTC 时区工作,因此无需在包含 DateTimeZone 信息的整个应用程序 DateTime 中使用。我们更喜欢使用LocalDateTime 来存储系统中的所有日期。
现在的问题是关于以 IOS 8601 格式打印LocalDateTime。看看下面的代码:
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // server timezone
DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); // yyyy-MM-dd'T'HH:mm:ss.SSSZZ
LocalDateTime createdAtLocalDateTime = LocalDateTime.now();
DateTime createdAtDateTime = user.getCreatedAt().toDateTime(DateTimeZone.UTC);
logger.info("DT: {}", fmt.print(createdAtDateTime));
logger.info("LDT: {}", fmt.print(createdAtLocalDateTime));
这会输出这样的结果:
DT: 2019-03-20T20:19:19.691Z
LDT: 2019-03-20T20:37:00.642
所以在序列化LocalDateTime 时末尾没有Z,但是当我们在UTC 时区序列化DateTime 时有Z。
现在的问题:如何配置格式化程序以在序列化 LocalDateTime 实例期间在末尾输出此 TimeZone 信息(此 Z 字母)。我知道它始终采用 UTC,但我们的一个使用库需要这个时区信息,很遗憾我们无法更改其中的代码。
更好的问题:如何配置Jackson ObjectMapper 以将LocalDateTime 序列化为json,最后带有Z 信息?
添加到格式化程序fmt.withZoneUTC() 不起作用。
【问题讨论】:
-
编写一个自定义序列化器/反序列化器,将 Z 附加到/从字符串中删除。并查看 Instant 类,它可能更符合您的需求
-
感谢您的评论。瞬间安静好。它适用于所描述的场景,但是当它存储到 MongoDb 时,它的存储方式如下:{“iMillis”:NumberLong(1553117383722)}。我们还想将信息存储在 IOS 8601 的数据库中
标签: java spring-boot jackson jodatime