为什么需要格式化日期
一般情况下,我们如果要将日期数据显示,就需要将日期格式化。例如下面的场景:
现在Student
类中有一个Data类型是字段,如果我们没有做任何处理。在我们打印时就会有如下显示:
显示结果为:
Student{score=100, name='Lvshen', date=Mon Oct 19 09:06:19 CST 2020}
如果直接入库,那么数据库中的日期字段就会显示:
Mon Oct 19 09:06:19 CST 2020
格式化日期类Date
上面的日期格式并不是我们想要的,如果你使用的Spring工程可以使用@JsonFormat
注解:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date date;
然后直接调接口获取到数据:
{
"score": 100,
"name": "Lvshen",
"date": "2020-10-19 09:52:24"
}
那么入库的日期字段显示就是:
2020-10-19 09:52:24
但是这样有一个问题,每创建一个实体类,每写一个日期类的字段,都需要添加@JsonFormat
注解,太过麻烦。可不可以全局控制这个日期格式呢?
我们可以在application.yml
文件里面加入:
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
就可以实现我们的需求了。
格式化日期类LocalDateTime
但是我们现在一般使用的Java8的LocalDateTime
。至于为什么使用LocalDateTime
而不是Date
,有兴趣可以看看官方文档。
private LocalDateTime localDateTime;
我们发现上面的全局配置使用失效了。
{
"score": 100,
"name": "Lvshen",
"date": "2020-10-19 10:35:40",
"localDateTime": "2020-10-19T10:35:40.241"
}
这里我们就需要使用
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime localDateTime;
显示结果:
{
"score": 100,
"name": "Lvshen",
"date": "2020-10-19 11:24:50",
"localDateTime": "2020-10-19 11:24:50"
}
全局配置类格式化LocalDateTime
如果我们需要全局格式化,可以这么写。我们编写一个配置类LocalDateTimeSerializerConfig
:
@Configuration
public class LocalDateTimeSerializerConfig {
@Value("${spring.jackson.date-format}")
private String pattern;
@Bean
public LocalDateTimeSerializer localDateTimeDeserializer() {
return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
}
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());
}
}
这个类就是我们想要的格式化的配置代码,字段pattern
就是格式化的样式规则。
{
"score": 100,
"name": "Lvshen",
"date": "2020-10-19 11:32:31",
"localDateTime": "2020-10-19 11:32:31"
}