为什么需要格式化日期

一般情况下,我们如果要将日期数据显示,就需要将日期格式化。例如下面的场景:

使用日期注解一个个格式化太麻烦?我来全局格式化一下_java

现在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.classlocalDateTimeDeserializer());
    }
}

这个类就是我们想要的格式化的配置代码,字段pattern就是格式化的样式规则。

{
    "score"100,
    "name""Lvshen",
    "date""2020-10-19 11:32:31",
    "localDateTime""2020-10-19 11:32:31"
}