Spring Boot中OffsetDateTime的Jackson日期格式

时间:2017-01-26 14:44:37

标签: java spring spring-boot jackson

我正在尝试从Spring应用程序输出OffsetDateTime,并在我的application.properties中输入这些属性:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
spring.jackson.date-format=yyyy-MM-dd'T'HH:mm

但是,当返回日期时,它的格式为

"2017-01-30T16:55:00Z"

如何在Spring应用程序中正确配置日期格式?

6 个答案:

答案 0 :(得分:8)

所以我设法找到了解决方案,但如果您有其他选择,请发布。

我最终创建了一个新的主ObjectMapper bean,并为OffsetDateTime注册了一个带有自定义序列化程序的新模块。我可以使用java.time.format.DateTimeFormatter在此设置我自己的日期格式。我还必须在我的映射器中注册JavaTimeModule

@Configuration
public class JacksonOffsetDateTimeMapper{

    @Primary
    @Bean
    public ObjectMapper objectMapper() {

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

        return objectMapper;
    }

}

答案 1 :(得分:7)

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

这样做,您可以获得ISO 8601的OffsetDateTime属性,包括目标中的偏移量。

答案 2 :(得分:3)

添加对jackson-modules-java8的依赖对我有用(不推荐使用jackson-datatype-jsr310)

<!-- deserialize Java 8 date time types e.g OffsetDateTime --> 
<dependency> 
  <groupId>com.fasterxml.jackson.module</groupId>
  <artifactId>jackson-modules-java8</artifactId>
</dependency>

我还需要添加它才能使其正常工作:

 om.registerModule(new JavaTimeModule());

无需将write-dates-as-timestamps = false或om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)-适用于Java“日期”对象。

我使用了以下注释:

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")  

并获得如下输出:

“时间戳”:“ 2020-04-23T08:00:00.000-06:00”

答案 3 :(得分:2)

  1. 将jackson-datatype-jsr310添加到您的依赖项
  2. 添加到application.properties:

    spring.jackson.serialization.write-dates-as-timestamps=false
    
  3. 你会得到:

    "lastUpdated": "2017-07-16T19:17:57.689Z"
    

答案 4 :(得分:1)

您是否尝试过将@JsonFormat(pattern="dd/MM/yyyy HH:mm:ss Z")放在字段前面?

@JsonProperty("timestamp")
@JsonFormat(pattern="yyyy-MM-dd'T'HH:mm")
private OffsetDateTime timestamp;

我想你会得到:

2017-01-30'T'16:55

答案 5 :(得分:1)

spring属性对我也不起作用。不过,将属性设置为ObjectMapper对我来说还是有用的。

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);