spring-boot - DateTimeFormatter.ISO_OFFSET_DATE_TIME 未按预期工作

标签 spring-boot datetime-format datetimeoffset

基于此 Java 日期时间 - OffsetDateTime.format() Examples DateTimeFormatter 的文章和官方文档我希望我的 OffsetDateTime 被序列化为 2011-12-03T10:15:30+00:00 其中偏移量是 +00:00 自UTC以来的偏移量。

我无法让 OffsetDateTime 使用偏移量进行渲染,它始终只使用“Z”祖鲁语进行渲染。我做错了什么?

enter image description here

这是Spring Boot 2.0.0.RELEASE ,正如您在屏幕截图中看到的那样,我在类路径上有以下模块并在 objectMapper 中注册,尽管我认为这不是相对的,因为这个问题似乎直接与 DateTimeFormatter 相关,我的对象映射器只是使用我给它的格式化程序。

它确实有影响,因为正如您在第二个屏幕截图中看到的那样,当我指定 BASIC_ISO_FORMAT 时,它确实会产生不同的结果。

我的 application.properties 中确实设置了此属性 spring.jackson.date-format= com.fasterxml.jackson.databind.util.ISO8601DateFormat 但据我了解,这没有影响在 OffsetDateTime 上,它只支持旧版 Java 中的旧 Date 对象。顺便说一句,改变这一点似乎没有预期的影响。

任何帮助将不胜感激。

使用 ISO_ZONED_DATE_TIME 格式... Using ISO_ZONED_DATE_TIME format

使用 BASIC_ISO_FORMAT... 这确实会产生影响,所以我知道格式化程序正在做某事,我只是不清楚为什么 ISO_ZONED_DATE_TIME 没有按预期呈现。 Using BASIC_ISO_FORMAT

 this.objectMapper = objectMapperBuilder.build()      
      .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)
      .disable(SerializationFeature.INDENT_OUTPUT)
      .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
      .disable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID);

 SimpleModule simpleModule = new SimpleModule();
 simpleModule.addSerializer(OffsetDateTime.class, new JsonSerializer<OffsetDateTime>() {
        @Override
        public void serialize(OffsetDateTime offsetDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            String formattedDate = DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(offsetDateTime);
            jsonGenerator.writeString(formattedDate);
        }
    });
this.objectMapper.registerModule(simpleModule);

OffsetDateTime now = OffsetDateTime.now();
TimeZone defaultTimeZone = TimeZone.getDefault();
ZoneId defautlZoneOffset = ZoneOffset.systemDefault();
String serializedOffsetDateTime = this.objectMapper.writeValueAsString(now);
//returns -> "2018-06-27T11:45:56.035Z"

最佳答案

功能,而不是错误

DateTimeFormatter. ISO_OFFSET_DATE_TIME 的文档告诉您在使用零偏移量(UTC 本身)时期望 Z 而不是 +00:00

那个文档说:

The format consists of:

• The ISO_LOCAL_DATE_TIME

• The offset ID.

点击第二个项目的链接,offset ID .该页面显示:

There are three formats:

• Z - for UTC (ISO-8601)

• +hh:mm or -hh:mm - if the seconds are zero (ISO-8601)

• +hh:mm:ss or -hh:mm:ss - if the seconds are non-zero (not ISO-8601)

ZISO 8601 的一部分标准。任何体面的日期时间库都应该能够使用 Z 解析字符串。

如果您坚持使用 +00:00 而不是更常见的 Z,则需要指定自定义格式模式,如 the Question 中所述由 Ole V.V. 链接

没有 -00:00

这样的东西

offset is -00:00 since its UTC.

您在问题中对 -00:00 的使用不正确。 ISO 8601 标准明确禁止这样的值。 UTC 本身的偏移量是正零,而不是负零:+00:00

RFC 3339它宣称自己是 ISO 8601 的“配置文件”。RFC 违反 ISO 8601 允许使用 -00:00,并为其分配未知偏移量的含义。恕我直言,这是一个非常糟糕且不明智的选择,令人困惑且不需要。 ISO 8601 已经说明了一个未知的偏移量:只需完全省略偏移量符号即可。

我建议避免这种负零的做法和 RFC 3339。

关于spring-boot - DateTimeFormatter.ISO_OFFSET_DATE_TIME 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51064131/

相关文章:

java - 扩展 RepositoryRestMvcConfiguration 打破了 Jackson LocalDateTime 序列化

datetime - ColdFusion - 具有 GMT 偏移量的日期时间格式

c# - 具有 C# DateTime 偏移量的 Excel 日期时间

javascript - Jquery 函数根据时间输入字符串增加一小时

python - 什么是 Vaex 函数将字符串解析为 datetime64,相当于 pandas to_datetime,允许自定义格式?

sql-server - datetimeoffset 的夏令时支持 (SQL Server)

java.lang.ClassNotFoundException : org. Spark_project.guava.collect.MapMaker

tomcat - 嵌入式Tomcat在哪里解压?

spring-mvc - Spring Boot + Tomcat 错误处理

windows - 将 Microsoft HPC-Cluster 日期设置为 ISO 格式