java 日期序列化, 反序列化的坑

背景知识

GMT是格林威治时间

CST 是北京标准时间, CST比GMT早8个小时。 一些工具类在格式化日期,会把日期转化成GMT时间再格式化。

使用jackson序列化日期存到cache中, 然后反序列回来, 发现反序列化后的日期比序列化时要小

1, 从数据库查到日期后, 默认是CST时区的,

2, 如果不设置, jackson 会默认把日期转化成 GMT时区对应的日期, 然后序列化成对应的字符串

3, 这样序列化后的日期字符串丢失了时区信息, 得到的日期字符串也不是我们想要的日期字符串了

4, 如果自定义了日期反序列化方式, 反序列化的时候会取系统默认的时区,也就是GMT时区,这时候日期就和序列化时不一致了

总结:

日期的序列化和反序列化时需要注意时区的设置, 如果设置了序列化日期, 在反序列化, 务必保证两次的时区一致

取时间戳计算后再根据时间戳创建时间比预期时间要快8小时 ?

问题代码:

以下算时间有问题吗, 有问题, 算出来的是GMT 0点的时间戳. 转换成CST就是 8:00了

1
2
3
4
5
6
7
8
9
10
11
    /**
* 获取当日日期
*
* @param date
* @return
*/
public static Date getDateShort(final Date date) {
final long l = date.getTime() / ONE_DAY;
return new Date(l * ONE_DAY);

}