mysql/mybatis/java中的时区转换

  • Post author:
  • Post category:java



一、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类型变量



版权声明:本文为qq_39326472原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。