使用spring boot的json输出中的日期格式

Posted

技术标签:

【中文标题】使用spring boot的json输出中的日期格式【英文标题】:Date format in the json output using spring boot 【发布时间】:2015-05-15 15:42:10 【问题描述】:

我正在使用 Spring Boot 来创建 REST 应用程序。我有一个如下所示的 DTO:

public class Subject 

private String uid;
private String number;
private String initials;
private Date dateOfBirth;

我使用 Spring-Hateos,我的控制器的 reurn 类型是 ResponseEntity<Resources<Resource<Subject>>>。我需要以“yyyy-mm-dd”格式显示日期。

【问题讨论】:

【参考方案1】:

如果您的应用程序使用 Jackson 整数将 bean 序列化为 JSON 格式,则可以使用 Jackson 注释 @JsonFormat 将日期格式化为指定格式。 在您的情况下,如果您需要将日期转换为 yyyy-MM-dd 格式,则需要在要应用此格式的字段上方指定 @JsonFormat

例如:

public class Subject 

     private String uid;
     private String number;
     private String initials;

     @JsonFormat(pattern="yyyy-MM-dd")
     private Date dateOfBirth;  

     //Other Code  

  

来自文档:

注释用于配置属性值的详细信息 将被序列化。

More Reference Doc

希望这会有所帮助。

【讨论】:

嗨,我在这里遇到了一个问题。 json格式显示的日期少了1天。 请发布您存储的值以及如何存储?从数据库或其他东西 我正在从 XMLGregorianCalendar 格式的肥皂服务中检索日期。我已将其转换为 java.util.Date,并将其转换为 json 格式。例如:将 XMLGregorianCalendar 对象转换为 Date 后,在控制台中显示 2014-02-11。但在 json 输出中显示的是 2014-02-10。 subject.setNumber(subjectContainer.getNumber()); subject.setInitials(subjectContainer.getInitials()); if(subjectContainer.getDateOfBirth() != null) subject.setDateOfBirth(subjectContainer.getDateOfBirth().toGregorianCalendar().getTime()); subjectContainer类型对象DateOfBirth字段的数据类型是什么?【参考方案2】:

您很可能的意思是“yyyy-MM-dd”,后面的小“m”表示分钟部分。

你应该做两件事

在您的 application.properties 中添加 spring.jackson.serialization.write-dates-as-timestamps:false,这将禁用将日期转换为时间戳,而是使用符合 ISO-8601 的格式

您可以通过使用@JsonFormat(pattern="yyyy-MM-dd") 注释dateOfBirth 属性的getter 方法来自定义格式

【讨论】:

嗨,我在这里遇到了一个问题。 json格式显示的日期少了1天。 使用 Spring Boot 1.3.0 测试,您似乎不需要 spring.jackson.serialization.write-dates-as-timestamps,但只使用 @JsonFormat 注释就足够了 有没有办法对所有日期执行此操作,而不必一一注释? @Pramod 你找到日期显示少1天的解决方案了吗 它为我显示了正确的日期(springboot v.2.0.3)【参考方案3】:

从 Spring Boot 版本 1.2.0.RELEASE 开始,您可以将一个属性添加到您的 application.properties 以将默认日期格式设置为您的所有类 spring.jackson.date-format

对于您的日期格式示例,您可以将此行添加到属性文件中:

spring.jackson.date-format=yyyy-MM-dd

参考https://docs.spring.io/spring-boot/docs/1.2.0.RELEASE/reference/html/common-application-properties.html

【讨论】:

如果它是一个属性,我相信它应该在某个地方导入。问题是在哪里。经过测试 - 如果只是添加到 application.properties 或 application.yml 则不起作用【参考方案4】:

如果您想更改所有日期的格式,您可以添加构建器定制器。下面是一个将日期转换为 ISO 8601 的 bean 示例:

@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() 
    return new Jackson2ObjectMapperBuilderCustomizer() 
        @Override
        public void customize(Jackson2ObjectMapperBuilder builder) 
            builder.dateFormat(new ISO8601DateFormat());        
                   
    ;

【讨论】:

效果很好!您应该将此添加到您的 AppConfig/@Configuration 类 这还能用吗?新的 ISO8601DateFormat()) 似乎已弃用

以上是关于使用spring boot的json输出中的日期格式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用spring boot格式化json日期格式

Spring boot:JSON将带有时区的日期和时间反序列化为LocalDateTime

Spring-boot @RequestBody JSON 到带有日期反序列化示例的对象?

spring-boot:对日期(Date)类型数据的序列化

spring-boot:对日期(Date)类型数据的序列化

Scala、Json 和 Spring Boot Rest