数据库

在数据库里如果使用了 datatime 格式,那存起来是如下格式显示:

spring boot json 序列化内 springboot默认序列化_时间格式化

返回到前端

全局配置

把实体类用 @RestController 往前端返回的时候,Date 数据会默认使用 ISO 8601 格式返回,也就是如下格式:

spring boot json 序列化内 springboot默认序列化_fastjson_02


其中尾部的 +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 兼容

很多序列化工具类配置会带有一个与 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() 可以看到:

spring boot json 序列化内 springboot默认序列化_fastjson_03


也就是说,使用 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 标准格式。

还需要一个序列化策略,可以从实体上配置注解,或者从方法上带时间格式化处理。