1.概述
如何在Spring Boot应用程序中格式化JSON日期字段。
使用Jackson格式化日期的各种方式,Jackson被Spring Boot用作其默认的JSON处理器。
2.在日期字段上使用@JsonFormat
2.1 设定格式
可以使用@JsonFormat注解以设置特定字段的格式:
@Data
public class Contact {
@JsonFormat(pattern="yyyy-MM-dd")
private LocalDate birthday;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime lastUpdate;
}
在生日字段中,使用仅显示日期的模式,而在lastUpdate字段中还包含时间。
使用了Java 8日期类型,这对于处理时间类型非常方便。 如果需要使用java.util.Date类型,也可以通过相同的方式使用注解:
@Data
public class ContactWithJavaUtilDate {
@JsonFormat(pattern="yyyy-MM-dd")
private Date birthday;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date lastUpdate;
}
最后,看一下通过使用具有给定日期格式的@JsonFormat呈现的输出:
{
"birthday": "2021-04-15",
"lastUpdate": "2021-04-15 04:08:02"
}
如上面所见,使用@JsonFormat注解是格式化特定日期字段的绝佳方法。
但是,仅当我们需要字段的特定格式时,才应使用它。 如果希望对应用程序中的所有日期都采用通用格式,那么有更好的方法来实现这一点。
2.2 设定时区
另外,如果需要使用特定的时区,可以设置@JsonFormat的timezone属性:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="Europe/Zagreb")
private LocalDateTime lastUpdate;
如果类型已经包含时区,例如java.time.ZonedDatetime,则无需使用它。
3.配置默认格式
尽管@JsonFormat本身具有强大的功能,但是对格式和时区进行硬编码可能会带来麻烦。
如果要为应用程序中的所有日期配置默认格式,一种更灵活的方法是在application.properties中配置它:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
尽管像这样设置默认格式非常方便和直接,但是这种方法还是有一个缺点。 它不适用于Java 8日期类型,例如LocalDate和LocalDateTime –只能使用它来格式化java.util.Date或java.util.Calendar类型的字段。
4.自定义Jackson的ObjectMapper
因此,要使用Java 8日期类型并设置默认日期格式,那么需要研究创建Jackson2ObjectMapperBuilderCustomizer bean:
@Configuration
public class ContactAppConfig {
private static final String dateFormat = "yyyy-MM-dd";
private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> {
//java.util.Date类型时间格式化
builder.simpleDateFormat(dateTimeFormat);
builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
};
}
}
上面的示例显示了如何在应用程序中配置默认格式。 必须定义一个bean并覆盖它的customize方法来设置所需的格式。
尽管这种方法可能看起来有些麻烦,但它的优点是它适用于Java 8和旧式日期类型。
还以通过Jackson2ObjectMapperBuilder
@Configuration
public class ContactAppConfig {
private static final String DATE_FORMAT = "yyyy-MM-dd";
private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Bean
public Jackson2ObjectMapperBuilder jsonCustomizer() {
Jackson2ObjectMapperBuilder builder
= new Jackson2ObjectMapperBuilder();
builder.simpleDateFormat(DATE_TIME_FORMAT);
builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
return builder;
}
}