查看时区:

SHOW VARIABLES LIKE "%time_zone%";

输出

Variable_name	     Value
system_time_zone CST
time_zone SYSTEM

分析:

这里有两个变量,其中 time_zone 是指 mysql 数据库的时区。默认为 SYSTEM,即等于服务器的系统时区。

system_time_zone 表示系统时区,因为我们的系统服务器是在中国,system_time_zone 为 CST(China Standard Time)。

这里有个坑,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

比如说 jdbc 驱动在读取到 system_time_zone 是 CST 后,它会默认为 美国中部时间而不是中国标准时。中国标准时与美国标准时相差 14个小时,最终取出来的时间比你实际存入的时间少14个小时(因为夏令时的缘故有时会少13个小时)。

 
实验剖析:
测试环境:本地时区是 utc+8, 数据库时区是 utc。
表:
CREATE TABLE `tb1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) DEFAULT NULL,
`createTime` datetime DEFAULT NULL,
`updateTime` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp(),
PRIMARY KEY (`id`)
)

案例1:

INSERT INTO table (dateCreated) VALUES (CURRENT_TIMESTAMP or NOW())

INSERT INTO tb1 (`name`, createTime, updateTime) VALUES ('lin', '2019-11-24 15:10', '2019-11-24 15:10');

INSERT INTO tb1 (`name`, createTime, updateTime) VALUES ('lin', NOW(), NOW())

查询结果为:(当前时间为 2019-11-27 15:28:13)

    id  name    createTime                    updateTime
------ ------ ------------------- ---------------------
3 lin 2019-11-24 15:10:00 2019-11-24 15:10:00
4 lin 2019-11-27 07:25:13 2019-11-27 07:25:13

说明:无论是 datetime 还是 timestamp 直接插入字符串不会变,插入 now() ,now() 的时间显示的是数据库当前时区所在当前时间,即 utc 时间。(比本地时间少 8 小时)

案例2:

INSERT INTO table (dateCreated) VALUES (?)
LocalDateTime time = LocalDateTime.of(2019, 11, 27, 15, 42);
jdbcTemplate.update("INSERT INTO tb1 (`name`, createTime, updateTime) VALUES ('lin', ?, ?)", time, time);

查询结果为:

    id  name    createTime                    updateTime
------ ------ ------------------- ---------------------
3 lin 2019-11-24 15:10:00 2019-11-24 15:10:00
4 lin 2019-11-27 07:25:13 2019-11-27 07:25:13
10 lin 2019-11-27 07:42:00 2019-11-27 07:42:00

说明: 

 jdbc 驱动读取数据库的时区信息,将本地时间转换为数据库时间,保存到数据库(比本地时间少 8 小时)
 

mysql 杂记 —— 时区问题的更多相关文章

  1. mysql设置时区方法

    set global time_zone = '+2:00'; ##修改mysql全局时区 set time_zone = '+2:00'; ##修改当前会话时区 flush privileges; ...

  2. 修改MySQL的时区

    修改MySQL的时区,涉及参数time_zone 首先需要查看mysql的当前时区,用time_zone参数 ? 1 2 3 4 5 6 7 8 9 [html] mysql> show var ...

  3. MySQL修改时区的方法小结

    这篇文章主要介绍了MySQL修改时区的方法,总结分析了三种常见的MySQL时区修改技巧,包括命令行模式.配置文件方式及代码方式,需要的朋友可以参考下 方法一:通过mysql命令行模式下动态修改 1.1 ...

  4. MySql数据库时区异常,java.sql.SQLException: The server time zone value '?й???׼ʱ?' is unrecognized or represents more than one time zone.

    JDBC访问MySql异常 Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException ...

  5. [转]MySQL修改时区的方法小结

    本文转自:https://www.cnblogs.com/mracale/p/6064447.html 这篇文章主要介绍了MySQL修改时区的方法,总结分析了三种常见的MySQL时区修改技巧,包括命令 ...

  6. mysql修改时区

    查看mysql当前时间 查看mysql时区设置 查看mysql数据库的时区 mysql修改时区的几种方法

  7. [ Mariadb ] 记录一次MySQL数据库时区的问题

    操作系统:Centos 7数据库:5.5.52-MariaDB 根本问题:由于系统时区不对,造成数据库的时区和数据的时间不正确. 处理办法: # 查看系统时区, [root@mongodb ~]# t ...

  8. mysql更改时区

    set global time_zone = '+8:00'; ##修改mysql全局时区为北京时间,即我们所在的东8区 set time_zone = '+8:00'; ##修改当前会话时区 flu ...

  9. mysql修改时区的几种方法(转载自https://www.cnblogs.com/shiqiangqiang/p/8393662.html)

    说明: 以下记录修改mysql时区的几种方法. 具体: 方法一:通过mysql命令行模式下动态修改 1.1 查看mysql当前时间,当前时区 select curtime(); #或select no ...

随机推荐

  1. PHP 获取星期

    <?php function getWeek($time = 0) { $week_array=array('日', '一', '二', '三', '四', '五', '六'); //先定义一个 ...

  2. 中国大学MOOC-翁恺-C语言程序设计习题集(一)

    练习 02-0. 整数四则运算(10) 本题要求编写程序,计算2个正整数的和.差.积.商并输出.题目保证输入和输出全部在整型范围内. 输入格式: 输入在一行中给出2个正整数A和B. 输出格式: 在4行 ...

  3. html5 iframe

    html5 iframe元素:用于在网页中嵌入另一个页面,或嵌入视频 可替换元素 显示内容取决于元素属性 css不能完全控制其中样式 通常是行内块盒子 <a href="" ...

  4. Java多线程系列——锁的那些事

    引入 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率. 下面先带大家来总体预览一下锁的分类图 java锁的具体实现类 1.乐观锁 VS 悲观锁 乐观锁与悲观锁是 ...

  5. kafka服务端实验记录

    kafka单机实验: 环境准备: 1.下载kafka,zookeeper,并解压 wget http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.11 ...

  6. idea之常见问题解决

    在启动类中的main方式时报类似java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest异常 解决方案:

  7. .NET/C# 检测电脑上安装的 .NET Framework 的版本

    原文:.NET/C# 检测电脑上安装的 .NET Framework 的版本 如果你希望知道某台计算机上安装了哪些版本的 .NET Framework,那么正好本文可以帮助你解决问题. 本文内容 如何 ...

  8. oracle数据库 TIMESTAMP(6)时间戳类型

    时间戳类型,参数6指的是表示秒的数字的小数点右边可以存储6位数字,最多9位.由于时间戳的精确度很高,我们也常常用来作为版本控制. 插入时,如下方式:insert into test4 values(t ...

  9. Oracle开放1521端口 telnet不通解决办法

    在windosw虚拟机server2012上安装Oracle数据库后,远程连接失败,报 java.sql.SQLException: The Network Adapter could not est ...

  10. error C2338: You've instantiated std::aligned_storage<Len, Align> with an extended alignment (in other words, Align >

    报的完整错误为: error C2338: You've instantiated std::aligned_storage<Len, Align> with an extended al ...