zoukankan      html  css  js  c++  java
  • 数据库报错 Can't map timezone to ‘**’ canonical timezone

    转载至https://juejin.im/post/5902e087da2f60005df05c3d?utm_source=tuicool&utm_medium=referral

     

    摘要

    名为 CST 的时区是一个很混乱的时区,在与 MySQL 协商会话时区时,Java 会误以为是 CST -0500 ,而非 CST +0800 。

    CST 时区

    名为 CST 的时区是一个很混乱的时区,有四种含义:

    • 美国中部时间 Central Standard Time (USA) UTC-06:00
    • 澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
    • 中国标准时 China Standard Time UTC+08:00
    • 古巴标准时 Cuba Standard Time UTC-04:00

    今天是“4月28日”。为什么提到日期?因为美国从“3月11日”至“11月7日”实行夏令时,美国中部时间改为 UTC-05:00,与 UTC+08:00 相差 13 小时。

    原因

    原来 Timestamp 被转换为会话时区的时间字符串了。问题到此已然明晰:

    1. JDBC 误认为会话时区在 CST-5
    2. JBDC 把 Timestamp+0 转为 CST-5 的 String-5
    3. MySQL 认为会话时区在 CST+8,将 String-5 转为 Timestamp-13

    最终结果相差 13 个小时!如果处在冬令时还会相差 14 个小时!

    解决方案

    解决办法也很简单,明确指定 MySQL 数据库的时区,不使用引发误解的 CST :

    mysql> set global time_zone = '+08:00';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set time_zone = '+08:00';
    Query OK, 0 rows affected (0.00 sec)

    或者修改 my.cnf 文件,在 [mysqld] 节下增加 default-time-zone = '+08:00' 。

    修改时区操作影响深远,需要重启 MySQL 服务器,建议在维护时间进行。

  • 相关阅读:
    centos 安装php7.0.2
    Yii restful api跨域
    为何我们总难听进别人的话
    workerman 7272端口被占用
    linux本地机上传文件到服务器
    linux命令-查找所有文件中包含某个字符串
    workerman程序调试
    关于吃苦
    哈夫曼编码
    链表的游标实现
  • 原文地址:https://www.cnblogs.com/httpc/p/9945382.html
Copyright © 2011-2022 走看看