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

时间:2019-03-20 20:47:12

标签: java spring-boot jackson jodatime

我正在Spring Boot中使用Rest API,我们正在使用出色的库Joda Time。由于我的服务器配置为在UTC时区工作,因此无需在其中具有DateTime信息的整个应用程序DateTimeZone中使用。我们更喜欢使用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

因此,在序列化Z时最后没有LocalDateTime,但是在UTC时区序列化Z时却有DateTime

现在是问题:在序列化Z实例期间,如何配置格式化程序以在末尾(此LocalDateTime字母)输出此TimeZone信息。我知道它始终在UTC中,但是我们的一个消耗图书馆希望此时区信息,但不幸的是我们无法更改其中的代码。

更好的问题:如何配置杰克逊ObjectMapper以将LocalDateTime最后的信息Z序列化为json?

添加到格式化程序fmt.withZoneUTC()无效。

1 个答案:

答案 0 :(得分:1)

您可以在格式化程序后面附加文字文字:

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