JDBC连接时有个TimeZone配置,这玩意到底有用吗?我是使用Postgresql和Mysql两个数据库验证的。结果如下:

数据库 部署方式 版本 JDBC连接TimeZone参数 JDBC连接serverTimezone参数 总结
Mysql docker 8.0 没用 有用,会使用客户端时区与设置的参数时区比较,并返回客户端时区对应的时间,详见实例1 Mysql使用JDBC连接时可以配置serverTimezone参数告诉客户端服务器的时区,因为Mysql的TimeStamp类型是没有时区概念的,且没有timestamp with time zone数据类型,只能通过连接时配置数据库server的时区,并通过两时区的对比,返回正确的客户端时区的时间
Postgresql docker 15.3 没用 没用 Postgresql使用JDBC连接时,时区参数均无效,但Postgresql有timestamp with time zone数据类型,使用该数据类型时不管数据库是什么时区设置,也不管客户端是什么时区设置,只要你的客户端时区不变,你存取得到的都是同一个时间,该时间的时区取决于客户端的时区。数据库中存储的是对应的UTC时区时间,比如:2023-05-24 00:51:24.578703 +00:00,详见实例2

实例1:

使用Mysql数据库,建表DDL如下:

create table test
(
a int null,
b timestamp null
);

数据库中存储的数据:

使用JDBC连接,不配置serverTimezone参数,客户端时区为东八区,执行以下SQL并用Java Date类型接收输出:

SELECT b FROM test WHERE a = 1;
SELECT now();

输出结果,注意Java的Date类型本身是没有时区属性的,这里之所以输出了CST可以自行研究Date的toString方法:

Tue May 23 15:13:46 CST 2023
Wed May 24 01:11:17 CST 2023

使用JDBC连接,配置serverTimezone参数为serverTimezone=UTC,客户端时区为东八区,执行上面的SQL并用Java Date类型接收输出:

Tue May 23 23:13:46 CST 2023
Wed May 24 09:12:52 CST 2023

总结:

当不使用serverTimezone配置时,JDBC连接中服务器时区被认为与客户端时区相同,因此数据库中存储的时间返回时被认为是东八区时间,无需变动,但SELECT now();返回的是Mysql服务器时间,即UTC时间。配置serverTimezone参数后,JDBC连接中服务器时区为UTC,客户端时区为东八区,查询数据库中时间被认为是UTC时间,返回给客户端时进行+8小时操作,同时SELECT now();返回值经过时区转换,正确的返回了东八区时间。

实例2:

使用Postgresql数据库,建表DDL如下:

create table test
(
a integer,
b timestamp with time zone
);

客户端时区为东八区,分别执行以下SQL:

INSERT INTO test VALUES (2, now());
SELECT b FROM test WHERE a = 2;
SELECT now();

查询结果如下:

Wed May 24 09:39:39 CST 2023
Wed May 24 09:39:39 CST 2023

数据库中存储结果:

修改客户端时区为东九区,重新执行以上SQL:

Wed May 24 10:42:17 KST 2023
Wed May 24 10:42:17 KST 2023

数据库中存储结果:

总结:

使用Postgresql的timestamp with time zone数据类型时,不管数据库是什么时区设置,也不管客户端是什么时区设置,只要你的客户端时区不变,你存取得到的都是同一个时间,该时间的时区取决于客户端的时区。数据库中存储的是转换后的UTC时间。

综上:

使用Mysql时,JDBC连接中应正确配置serverTimezone参数;使用Postgresql时,使用timestamp with time zone数据类型。来保证获取时间时时区的正确性。

另外,建议能不用数据库的now()就别用了,数据库时区会搞得你头疼;更近一步,能别用时间(Date)就别用了,时间戳没有时区的概念,当前端需要显示的时候再通过DateFormat或Json转换配置时区即可,可以省去很多需要考虑时区的工作。

以上是我自己的实验结果,如果你有不同的结论,欢迎一起探讨。

【数据库】时区及JDBC的时区设置的更多相关文章

  1. REDHAT一总复习1 NTP更改时区,并验证时区设置是否正确

    把计算机时区调整到巴哈马(这是个啥地方?听都没听过.) 使用 tzselect  进行确定时区,并进行可对话性的设置,按照对应的序号,射进去就行了. 使用:timedatectl set-timezo ...

  2. Java面试题精选(二)线程编程、数据库理论和Jdbc部分

    —— 线程编程.数据库理论和Jdbc部分内容 ——     数据库的开发应用想必是我们日常所碰到最多的知识点了,大致可分为:oracle.MySQL.SQL Server.Hadoop. NoSQL. ...

  3. 深入理解JDBC的超时设置

    恰当的JDBC超时设置能够有效地减少服务失效的时间.本文将对数据库的各种超时设置及其设置方法做介绍. 真实案例:应用服务器在遭到DDos攻击后无法响应 在遭到DDos攻击后,整个服务都垮掉了.由于第四 ...

  4. Lotus Domino和关系型数据库(LEI,DESC,JDBC连接)

    Domino和关系数据库进行交互是日常项目开发中经常涉及到的一个方面,每个domino开发人员都写过这样的程序,本文就这个方面做一下简单的总结. 一.工具篇 1.使用LEI(Lotus Enterpr ...

  5. Java数据库操作(JDBC)

    JDBC Java数据库连接(Java DataBase Connectivity,JDBC)用于在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库 ...

  6. 彻底解决Odoo8.0单时区应用中的时区问题

    原文地址:http://shine-it.net/index.php/topic,17001.0.html 由于数据库中存储的是UTC时区,默认情况下数据导出和group by都存在时区问题.彻底解决 ...

  7. 数据库程序接口——JDBC——功能第二篇——数据源之C3P0数据源

    综述 C3P0由三部分内容组成.实例化对象,各配置项的含义,以及加载配置项的方式. 实例化对象的方式有三种,第一种方式直接new ComboPooledDataSource,第二种方式使用工厂类Dat ...

  8. spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置

    spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...

  9. 三种数据库访问——Spring JDBC

    本篇随笔是上两篇的延续:三种数据库访问——原生JDBC:数据库连接池:Druid Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要 ...

  10. java数据库编程:JDBC操作及数据库

    掌握JDBC操作步骤, 掌握数据库驱动程序配置 可以使用JDBC进行数据库连接. JDBC本身是一个标准,因此操作步骤是固定的,以后只需要修改很少代码就可以达到不同数据库间连接转换功能. 操作步骤: ...

随机推荐

  1. Spring MVC的请求处理逻辑

    当大家了解了如何编写一个简单的Spring MVC程序后,大家心中应该会有一些好奇:这背后到底发生了什么? Spring MVC是怎么把这些功能串联起来的?我们只是写了一个控制器而已,HTTP请求是怎 ...

  2. c++的thread小测试

    windows环境还用不了thread,得下一些mingw,弄了半天没弄好,直接用了商店中心就有的Ubuntu了,但是sudo install g++出现了下载不了的问题,解决方案:https://b ...

  3. Maven 自动化构建

    一.Maven:是一款服务于 Java平台的自动化构建工具 [1]Maven可以将一个项目按模块划分成不同的工程,利于分工协作;[2]Maven可以将 jar包保存在自己的中央"仓库&quo ...

  4. 用ACDSee查看Office文档?No!有中文解决方案吗?暂未发现!

    看图软件选择 用过不少看图软件,20年前就觉得ACDSee实在太好用了,界面漂亮.速度快.格式多.体积小! 后来图像格式越来越丰富,ACDSee版本也越来越新,体积越来越大. 看图软件也越来越繁杂,免 ...

  5. grub 命令使用

    命令列表 ubuntu 的 iso 盘内一般有 command.lst 这个文件,里面是 grub 支持的命令 加载字体 ( 方便中文显示 ) grub> loadfont $prefix/fo ...

  6. 解决 ssh 找不到对应主机密钥类型

    解决办法 如果最近升级到了 openssh 8.8 版,你会发现连接某些之前连接得好好的服务器突然无法连接: Unable to negotiate with x.x.x.x port 2222: n ...

  7. JS - new Function

    Function 在JavaScript当中,除了可以使用function或箭头函数定义方法外,还可以使用new Function的形式动态创建函数,此时与eval()方法类似 创建一个不接收参数的方 ...

  8. 二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈

    二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈 Kubernetes 开源不易,帮忙点个star,谢谢了 介绍 kubernetes二进制安装 后续尽可能第一时间更新 ...

  9. [数据库/MYSQL]#解决缺陷#设置Unique索引时:"[Err] 1071 - Specified key was too long; max key length is 767 bytes"

    1 问题复现 原表结构: CREATE TABLE `XX_TEMPERATURE` ( `FLOW_ID` int(11) NOT NULL COMMENT '独立的数据表或FTP唯一标识', -- ...

  10. Vue 环境准备

    近期接触了下前端项目,记录下学习过程. 近几年前端发展的迅猛,各种框架层出不穷,vue react angular ,各种第三方组件 原来会点js,jQuery 前后端一个人全搞定了,现在前后端分离, ...