自古以来,我们的springboot项目中常有这样的不一致问题:
在没有一个统一约定的情况下,这些确实是老大难问题。
现在约定一个统一标准。
注:以下内容都经过验证,非凭空臆想。
如果这样约定的话,则任何地方,我们都不再需要:
springboot项目中,如果声明一个@RestController 接口,如果返回 Date格式的话,则前端通过http接收到的格式默认为:Tue May 24 2022 17:49:42
。
这一点想必大家深受其扰。
但实际上,这是因为springboot框架中默认使用了jackson
进行序列化。我们只需指定一个全局的jackson序列化格式即可,非常简单
在application.properties
配置文件增加以下配置:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
有些时候,有的人并不想用默认的jackson序列化内容,于是就采用了自定义的序列化库。
如Gson
等。
办法:在指定自定义的序列化库的时候,顺便指定Date序列化的格式。
项目很简单试一下就明白了。
https://download.csdn.net/download/festone000/85465322
或仓库地址:
https://gitee.com/festone/springboot-datetime-demo
内容是一样的。
综上,此做法具备一切优点,没有任何不足,值得大力推广。
但由于现状的原因,返回给前端的不是“yyyy-MM-dd HH:mm:ss”格式,而是 毫秒时间戳格式。
故,我们统一全局配置一下格式,使得:
ResDTO中的Date类型,给前端的时候直接就是毫秒时间戳格式。
毫秒时间戳格式的请求参数,后端也可以直接用Date类型接收。
前后端双方都不需要额外的任何显式转换。
示例(springboot版本 2.1.9.RELEASE,与当前我们项目中用的版本一致):
application.yml文件:
spring: jackson: # yyyy-MM-dd HH:mm:ss 格式 #date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 serialization: # 毫秒时间戳格式 write-dates-as-timestamps: true
resDTO 示例:java 类型:
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class XtResponse implements Serializable { private String name; private Date date; }
reqDTO示例:
java类型:
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class DateReq implements Serializable { private String name; private Date date; }
综上,完美,具备一切优点,基本上可以说没有任何缺点。