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 服务器,建议在维护时间进行。

  • 相关阅读:
    Huffman树与编码
    Python引用复制,参数传递,弱引用与垃圾回收
    Git使用说明
    numpy使用指南
    Python Socket
    温故知新之 数据库的事务、隔离级别、锁
    Oracle数据库的语句级读一致性
    VirtualBox NAT方式与主机互相通信
    Linux的定时任务
    Redis学习
  • 原文地址:https://www.cnblogs.com/httpc/p/9945382.html
Copyright © 2011-2022 走看看