【问题标题】:LocalDateTime from Joda Time ISO 8601 formating with no timezone information来自 Joda Time ISO 8601 格式的 LocalDateTime,没有时区信息
【发布时间】: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


【解决方案1】:

您可以将文本文字附加到格式化程序:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
        .append(ISODateTimeFormat.dateTime())
        .appendLiteral('Z')
        .toFormatter();

【讨论】:

  • 你认为LocalDateTime对象序列化后会离开Z吗? @shmosel
  • @MS90 绝对。
  • 这是一个很好的答案。我可以假设 Z 总是在最后,因为服务器总是在 UTC 中工作。谢谢你。似乎Instant 也没有 TimeZone 信息,最后用Z 序列化,所以我不明白为什么LocalDateTime 不包含它。这不一致,看起来像一个错误。
  • @MarcinKapusta 这不是错误。 LocalDateTime 没有时区,因此包含Z 没有意义。
  • 但是Instant也没有时区,并且Z在序列化过程中出现在末尾:)
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多