java获取系统时间和mysql数据库时间相差14小时

墨蓝 2022-12-20 12:45 349阅读 0赞

前言

mysql8.x的jdbc升级了,增加了时区(serverTimezone)属性,并且不允许为空。

问题现象

java应用程序获取当前时间new Date() 存储数据库时,和系统时间相差14小时。

问题分析

1、服务器时间不同步

使用命令:date,查看linux服务器时间

  1. [root@abc ~]# date
  2. Sat Mar 7 18:43:30 CST 2020

服务器的机器时间没有问题

2、程序问题

  1. uLog.setLogTime(new Date());

程序是使用的机器时间,不会有问题

3、数据库时间

查看数据库时间:select sysdate()

  1. mysql> select sysdate();
  2. +---------------------+
  3. | sysdate() |
  4. +---------------------+
  5. | 2020-03-07 18:48:01 |
  6. +---------------------+
  7. 1 row in set

4、查看mysql时区设置

  1. show variables like '%time_zone%';
  2. ±-----------------±-------+
  3. | Variable_name | Value |
  4. ±-----------------±-------+
  5. | system_time_zone | CST |
  6. | time_zone | SYSTEM |
  7. ±-----------------±-------+

而mysql time_zone为SYSTEM时,会取 system_time_zone值作为协调时区。

  • 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

    今天是“1月13日”。美国从“3月11日”至“11月7日”实行夏令时,11月8号至次年3月11日实行冬令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。而冬令时 UTC-06:00则会相差14个小时。

解决方案

1、设置mysql时区
(1)通过修改my.cnf,需要重启mysql

  1. default-time-zone = '+8:00'

(2)通过命令行在线修改

  1. set time_zone = '+8:00';

2、设置连接mysql url时区参数

  1. 修改前:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
  2. 修改后:jdbc:mysql://[IP]:[PORT]/[DB]?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

参考:

  1. [https://blog.csdn.net/kk514020/article/details/103955216][https_blog.csdn.net_kk514020_article_details_103955216]
  2. [https://www.cnblogs.com/zhuitian/p/12436300.html][https_www.cnblogs.com_zhuitian_p_12436300.html]

发表评论

表情:
评论列表 (有 0 条评论,349人围观)

还没有评论,来说两句吧...

相关阅读