java数据保存时区问题

概述

  我觉得作过java开发的都会遇到这个时区的问题,除非你是初学者。要是做过docker系统部署的,肯定会遇到docker容器时间和系统时间不一致的问题。本人对这个时区真的是相当的烦啊,在这里做一个小小的总结提示。

  本人当前的项目是spring-cloud+vue,数据库是mysql

问题描述

第一步

  前端使用DatePicker的组件日期选择31日,然后点击保存之后,在浏览器的工具里面的NetWork中查看当前发送的请求,结果就变成了“2020-10-30T16:00:00.000Z”,很明显这已经少了8个小时。

  然后,到后端打了断点,显示的时间为“Sat Oct 31 00:00:00 CST 2020”,很明显又变成了31。

  最后保存到数据库(date类型),显示时间为:“2020-10-30”,很明显又少了8个小时。

第二步

  点击查询显示数据。在后端打断点,显示的时间为“Sat Oct 30 08:00:00 CST 2020”,。

  前端时间显示,浏览器工具的NetWork中显示为“2020-10-30T00:00:00.000+0000”.

  就这样,从保存进去到读取出来时间就变了。为什么呢?

分析

1. 标准的不同

  “2020-10-30T16:00:00.000Z”和“Sat Oct 31 00:00:00 CST 2020”显示虽然是不一样的,但是表达的时间值却是一样的,因为他们只是显示的标准的不同。

2020-10-30T16:00:00.000Z 时间标准
这个格式表示的是世界标准时间,本初子午线,0时区的时间。T 表示的是分割符,Z表示的是UTC(世界标准时间)。如果要变成北京(上海)时间需要在当前时间上加8小时(东八区)。
Sat Oct 31 00:00:00 CST 2020 时间标准
这个格式表示的是中国标准时间,东八区的时间。

2. 数据库类型错误

  由于我门选择的是date类型,保存到该字段的数据会自动将时间剪切掉只剩下日期部分,所以当以世界标准时间保存进去的时候,将时间部分干掉就剩下了30.

  然后我们再进行读取的时候虽然再时区上加了8,但是却是再30日的0时加的8,这个时候的时间还是30日。

  所以我们再数据的日期类型上应该选择datetime类型,将时间也包含进来,保证时区的转换使用。

3. spring的json转化错误

  spring的json不会按照我们当地的时区机型转化,所以controller在进行json转化的时候我们要指定好json的时区。比如在application.yml中配置:

spring:
  jackson:
    # 这个是再国际标准的时区上加8表示东八区,北京上海的时区。spring的json数据转化时自动转为国际标准时间(不是中国标准时间)。
    # 数据库存储的时间正常情况下也是少八个时区,数据库自动存储的是国际标准化时间,但是在代码里可以自动转化为Date的当前系统所在时区的时间
    time-zone: GMT+8

你可能感兴趣的:(java,java)