jackson 解决时间少一天的问题

在jersey或者spring mvc等框架中使用jackson把实体类装换成json,经常会遇到这样一个问题:转换出来的时间总是要少一天,为什么会这样呢?

 

1.发现问题

如果实体类中的Date字段不加任何处理,jackson就会在json中把Date字段转换成毫秒。前端收到json后,使用js对毫秒进行处理。我本来是这么打算的,结果发现好像有些不对劲。

比如说:数据库中的时间是2017-01-17,jackson转成的毫秒数就是1484582400000,前端写个js脚本转一转:

输出来的日期是2017-01-16T16:00:00.000Z。看上去好像少了一天啊!到底是怎么回事呢?

2.解决问题

事实上,这个问题是jackson默认设置的锅。2017-01-16T16:00:00.000Z是jackson默认转换的别的时区的时间,和北京时间(我们要的时间)不是一个时区,所以造成了“展示”上的不同,实际上是同一时间。

查了之后,发现了这样一个注解:

@JsonFormat(pattern = ConstVal.DATE_FORMAT, timezone = ConstVal.TIME_ZONE)

用于修饰实体类中的Date字段

DATE_FORMAT为时间格式,例如:yyyy-MM-dd

TIME_ZONE为时区,例如:GMT+8

这样设置之后,数据库中的时间是2017-01-17,解析的json中的时间就变成了2017-01-17,再也不是毫秒数了,不需要前端再次进行转换,直接使用即可。

3.能不能在前端转换时区?

可以哦,但是没有现成的方法可以转换,需要自己写,我在网上找了一段脚本,写得不错,可供参考哦:

4.总结

其实感觉在后端规定时间格式比较好,毕竟需要记录日志,如果日志记录毫秒,这样审查起来就太不方便了。而且后端给出规范,前端来遵守,这样就更有条理一些,可以有效防止个别前端随心所欲。

发表评论

电子邮件地址不会被公开。 必填项已用*标注