在数据库里如果使用了 datatime
格式,那存起来是如下格式显示:
把实体类用 @RestController 往前端返回的时候,Date 数据会默认使用 ISO 8601 格式返回,也就是如下格式:
其中尾部的 +00:00 指时区,这种方式返回至前端不太友好,可以在配置文件内配置一下:
spring:
jackson:
# 格式化返回时间 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;
有了这个注解,就可以在 JSON.toJSONString(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 兼容的选项:
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 可以配置进 JSON.toJSONString(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";
JSON.toJSONStringWithDateFormat(object, DATE_FORMAT)
如果实体太多时可以统一在方法上进行时间格式化处理。
也就是说我们需要一个返回策略,可以选择 时间戳 或者 yyyy-MM-dd HH:mm:ss 标准格式。
还需要一个序列化策略,可以从实体上配置注解,或者从方法上带时间格式化处理。