⼀⽂搞定springboot处理时间⽇期格式化、序列化问题(从数据库⾄前端)数据库
在数据库⾥如果使⽤了 datatime 格式,那存起来是如下格式显⽰:
返回到前端
全局配置
把实体类⽤ @RestController 往前端返回的时候,Date 数据会默认使⽤ ISO 8601 格式返回,也就是如下格式:
其中尾部的 +00:00 指时区,这种⽅式返回⾄前端不太友好,可以在配置⽂件内配置⼀下:
spring:
jackson:
fastjson怎么用
#  格式化返回时间 yyyy-MM-dd HH:mm:ss
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
或者采⽤时间戳:
spring:
jackson:
#  返回时间戳
serialization:
write-dates-as-timestamps:true
⾄于前端怎么解析是有很多⽅法的,这⾥不做详述了。
注:以前 springboot 是默认返回时间戳的,现在是默认返回 ISO 8601。
个别配置
可以在实体类的变量上⽤注解 @JsonFormat 指定返回给前端的格式:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date date;
序列化
从实体上配置
这⾥以 fastjson 举例,在 fastjson ⾥有⼀个注解 @JSONField 可以指定该类序列化的时候如何处理该时间变量,⽰例如下:
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date;
有了这个注解,就可以在 JSONString(object) 序列化的时候把该时间变量序列化为指定格式。
注意不要和 springboot 返回到前端的格式化注解 @JsonFormat 搞混了,这两个注解可以⼀起使⽤:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date;
是否选择与 json-lib 兼容
很多序列化⼯具类配置会带有⼀个与 json-lib 兼容的选项:
private static final SerializeConfig config;
static{
config =new SerializeConfig();
config.put(java.util.Date.class,new JSONLibDataFormatSerializer());// 使⽤和json-lib兼容的⽇期输出格式
config.put(java.sql.Date.class,new JSONLibDataFormatSerializer());// 使⽤和json-lib兼容的⽇期输出格式
}
这个 config 可以配置进 JSONString(object, config) ⾥,这样就可以与以前的 json-lib 兼容。
json-lib 存时间的时候会把时间变量内的每个 key 映射成⼀个实体来对待,我们打开兼容处理类 JSONLibDataFormatSerializer() 可以看到:
也就是说,使⽤ json-lib 兼容策略在序列化时会把时间拆成实体,但最⼤的问题在于 fastjson 不⽀持反序列化 json-lib 格式的实体。
所以,在现在的项⽬中,我们不应该使⽤该兼容策略。
从⽅法上处理
除了在实体变量上配置注解,在序列化时直接采⽤带 时间格式化 的序列化⽅法也可以:
private static final String DATE_FORMAT ="yyyy-MM-dd HH:mm:ss";
如果实体太多时可以统⼀在⽅法上进⾏时间格式化处理。
总结
也就是说我们需要⼀个返回策略,可以选择 时间戳 或者 yyyy-MM-dd HH:mm:ss 标准格式。
还需要⼀个序列化策略,可以从实体上配置注解,或者从⽅法上带时间格式化处理。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。