没有时区信息的 Joda Time ISO 8601 格式的 LocalDateTime

LocalDateTime from Joda Time ISO 8601 formating with no timezone information

我正在 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[=26] =]

现在是问题:在序列化 LocalDateTime 个实例期间,我如何配置格式化程序以在最后(这个 Z 字母)输出这个时区信息。我知道它始终采用 UTC,但我们的一个消费库需要此时区信息,不幸的是我们无法更改其中的代码。

更好的问题:如何配置 Jackson ObjectMapper 以在结束?

添加到格式化程序 fmt.withZoneUTC() 不起作用。

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

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