Jackson @JsonFormat将日期缩短了一天

Wil*_*nda 20 format json jackson spring-data-rest spring-boot

我在我的项目中使用了Spring Date Rest with Spring Boot.这个项目有一个对象,我使用注释@JsonFormat格式化将从我的Json接收的日期字段.字段Date的格式为"dd/MM/yyyy".当我发送我的json值"08/07/1980"时,杰克逊转换为值"07/07/1980".

问题是@JsonFormat将日期设置为少一天

这是我的源代码

@Temporal(TemporalType.DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy", locale = "pt-BR", timezone = "UTC")
private Date birthDate;
Run Code Online (Sandbox Code Playgroud)

谢谢

Wil*_*sus 29

嘿伙计们使用这个解决方案,它比我的解决方案更有效,更现代.

/sf/answers/3181922621/

谢谢@Benjamin Lucidarme

我使用以下方法解决了问题

@Temporal(TemporalType.DATE)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy", locale = "pt-BR", timezone = "Brazil/East")
private Date birthDate;
Run Code Online (Sandbox Code Playgroud)

我将时区更改为"Brazil/East"或"America/Sao_Paulo"并立即开始工作

谢谢

  • 我有同样的问题,谢谢! (2认同)
  • 同样的问题,同样的解决方案:)) (2认同)

Ben*_*rme 9

@ William的答案有效,但您应该将这些行添加到application.properties文件中:

spring.jackson.time-zone=Brazil/East
spring.jackson.locale=pt-BR
Run Code Online (Sandbox Code Playgroud)

这样,您只需指定一次时区和区域设置,并且它适用于您的应用程序的所有日期.

  • 谢谢,您的解决方案更加有效和现代化 (3认同)

Mic*_*mal 6

我会选择将ObjectMapper时区设置为默认 JVM 时区:

    ObjectMapper objectMapper = new ObjectMapper();
    //Set default time zone as JVM timezone due to one day difference between original date and formatted date.
    objectMapper.setTimeZone(TimeZone.getDefault());
Run Code Online (Sandbox Code Playgroud)

如果您不知道服务器环境使用什么时区,这是一个更好的解决方案。

spring-boot环境中您可以覆盖默认值JacksonAutoConfiguration

@Bean
ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
    return builder.createXmlMapper(false)
            // Set timezone for JSON serialization as system timezone
            .timeZone(TimeZone.getDefault())
            .build();
}
Run Code Online (Sandbox Code Playgroud)