Spring对前后台回传数据中日期类型数据的格式化处理
项目问题
Spring或者SpringBoot项目中难免会遇到如下两个问题
- 后端从数据库查询的出来的数据放到前端页面展示时,日期时间格式是时间戳(1656425423)或者带有符号T的日期时间格式(2022-06-28T22:10.:21)
- 前端传给后端的日期时间格式不符合后端接收参数的字段类型和日期时间格式
前置知识
Java8日期类型和数据库日期类型的通过JDBC映射关联
Java8日期类型 | 数据库日期类型 |
LocalDate | Date |
LocalTime | Time |
LocalDateTime | Timestamp |
解决后端到前端日期时间格式保持一致的问题
从数据库获取时间传到前端进行展示的时候,在数据库中显示的是正确的时间格式,获取出来却变成了很丑的时间戳或者带有符号T的日期时间格式,通过全局配置或者使用@JsonFormat
解决这个问题
全局配置日期时间格式化
在application.yml配置文件中加入如下配置。但有个缺点,该配置只能格式化Date类型的日期时间数据,对LocalDateTime不起作用
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
对该配置进行测试数据如下
{
"code": 200,
"message": "获取时间",
"obj": {
"localDateTime": "2022-06-28T23:03:13.105",
"date": "2022-06-28 23:03:13"
}
}
使用@JsonFormat
导入@JsonFormat所需要的包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
在实体类的属性上添加@JsonFormat
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime birthday;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 说明
pattern:设置需要转换的时间日期的格式
timezone:设置时区,避免时间在转换中有误差
注:@JsonFormat注解可以在属性的上方,同样可以在属性对应的get方法上
解决前端到后端日期时间格式保持一致的问题
前端回传日期时间给后端,比如回传一个带出生日期的JSON数据,这时前端传递给后端的时间格式同样如果不一致,后端无法做实体对象字段的映射关系,可以通过@DataTimeFormat
解决这个问题。当然可以通过将后端接收JSON数据的实体对象字段中日期时间的字段类型改为字符串,然后通过Java类的DateTimeFormatter
进行手动的格式化(这个可以抽取为全局的组件,后期补充)
导入joda-time依赖包和Spring依赖包,本身是Spring项目就不用导入Spring依赖包了
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>
在接收JSON数据的对象属性上添加@DateTimeFormat
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime birthday;
总结
注解@DateTimeFormat
主要是前端到后端的时间格式的转换
这两个注解可以同时在一个字段上标记,不冲突
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private LocalDateTime birthday;