一、Java中
Unix服务器和数据服务器在一个时区就可以了,传的4.22 0点的时间戳。实际上并的是相对70.1.1 日 8:00的时间戳,并不是相对70.1.1 日的时间戳。只要大家有一致的偏移量,就不会有问题
date里面存的就是long,即当前距离标准时间的时间戳,date的打印,SimpleDateFormat的parse,都是根据操作系统当前的时区做了转换。前端传过来也是一个距离标准时间的时间戳。
二、mysql数据库中
2.0 system_time_zone 及 time_zone参数
show variables like "%time_zone";
全局参数system_time_zone
系统时区,在MySQL启动时会检查当前系统的时区并根据系统时区设置全局参system_time_zone的值。
全局参数time_zone
用来设置每个连接会话的时区,默认为system时,使用全局参数system_time_zone的值。
可以认为system_time_zone是一个时区底层数据,真正生效的时区设置是time_zone,time_zone可以选择数据来源为system_time_zone,也可以自定义设置。
2.1 DateTime
DateTime 类型是没有时区信息的(时区无关),当你的时区更换之后,比如你的服务器更换地址或者更换客户端连接时区设置的话,就会导致你从数据库中读出的时间错误。
2.2 Timestamp
Timestamp 和时区有关,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。说简单点就是在不同时区,查询到同一个条记录此字段的值会不一样。timestamp类型每次读取、存入都要做时区转换,额外的性能消耗,好处是数据访问可以随时区变化
三、mybatis对时区的处理
会读取连接的数据库的时区,做一个转换。转换成UTC时间戳的date类型变量