原文地址:mysql中的CST时区问题_ljj125896的博客-CSDN博客_数据库时区cst
原因:
1.mysql中的CST时区问题
在项目操作过程发现了一个时区的问题,问题现象为sql打印的时间和数据库里面存储的时间不一样。后来发现问题原因为mysql的时区为CST。网上搜索了下CST时区,才发现这个时区已经被诟病已久。它居然能够表示四种时区,分别为:
1.美国中部时间 Central Standard Time (USA) UTC-06:00
2.澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
3.中国标准时 China Standard Time UTC+08:00
4.古巴标准时 Cuba Standard Time UTC-04:00
由于CST存在歧义,所以导致java通过jdbc去获取时区的时候,就会出现问题,通常会把CST解析为GTM+3时区。
这个时候,通常有两个解决办法:
1.修改mysql的设置,把mysql的时区设置为UTC或+8:00
修改mysql的时区也有两种方式
1)通过客户端连接mysql,通过命令设置时区
可以先查看当前时区:show variables like '%time_zone%';
确认时区为CST后再进行修改:set time_zone='+8:00';
2)修改my.cnf文件,再mysqld设置项下添加default-zone-time='+8:00'
2.修改jdbc连接设置,直接把连接的时区固定死,绕开mysql本身的时区。
就是在jdbc连接配置上添加以下两个配置即可:
useTimezone=true&serverTimezone=GMT%2B8
分别为启用时区设置和设置连接服务的时区。
此时,jdbc操作都会使用自定义时区去进行时间处理。
2.原文地址:MySQL修改数据库时区 - 北斗星君 - 博客园
MySQL修改数据库时区
在服务器环境下(linux 或 docker),有时系统时区默认是 UTC 时区,这时需要格外注意下应用使用的时区信息。
在使用 ef + linq 执行 mysql 查询时,若查询条件中含有 Datetime.Now(),则会按 mysql 的时区信息查询,造成时间错乱。
可以使用 select now(); 来检查 mysql 的当前时间是否准确。
修改 mysql 的时区配置:
1、临时配置(重启后失效):
set time_zone = '+8:00'; set global time_zone = '+8:00';
注意,执行以上语句后,需重新连接 mysql 生效。
2、永久配置(重启仍有效):
修改 my.cnf 文件配置(修改后重启 mysql 生效):
# 设置默认时区 [mysqld] default-time_zone='+8:00'
北京时间为东八区
--查看数据库时区设置
mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | UTC |
| time_zone | SYSTEM |
+------------------+--------+
-修改当前会话时区,退出msql后 time_zone 会恢复成修改前的值
mysql> set time_zone = '+8:00'; ##修改mysql全局时区为北京时间,即我们所在的东8区
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | UTC |
| time_zone | +08:00 |
+------------------+--------+
—-修改全局会话时区
mysql> set global time_zone = '+8:00';
mysql> set time_zone = '+8:00';
mysql> flush privileges;