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. ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  2. Go语言 :使用简单的 for 迭代语句进行 TDD 驱动测试开发与 benchmark 基准测试

    前提准备与运行环境请参考:(新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4   在 Go 中 for 用来循环和迭代, ...

  3. Vue-Router 路由与配置

    ​现在的很多应用都流行SPA应用(singe page application) . 传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个时候因受到网络.性能的影 ...

  4. CoordConv:给你的卷积加上坐标

    摘要:本文主要对CoordConv的理论进行了介绍,对其进行了复现,并展示了其在网络结构中的用法. 本文分享自华为云社区<CoordConv:给你的卷积加上坐标>,作者: 李长安. 一.理 ...

  5. vue-router面试题

    1.vue-router怎么重定向页面? 答:路由中配置redirect属性 2.vue-router怎么配置404页面? 答:path: '*' 是对的 但是应该放在最后一个 3.切换路由时,需要保 ...

  6. ArcGIS JS API加载带参数的rest服务参数被截掉问题处理

    我们在做一些项目的时候,会对ArcGIS的图层服务进行转发,增加一些权限参数以保证数据访问的安全, 但使用ArcGIS JS API加载的时候,对于rest服务?后增加的参数会被截掉. 为解决这个问题 ...

  7. laravel实现大数据csv导出

    首先说明几点: excel格式的文件最大支持100万的数据,所以不考虑使用excel格式 laravel的toArray()方法有内存泄露,所以大量数据导出不能使用. 当然要使用chunk方法查询数据 ...

  8. 靶机渗透【billu_b0x】

    ip扫描 访问80端口 目录扫描 逐个访问 上传一个图片马,结果没有回显 显示file参数为空.请在"文件"参数中提供文件路径 打开发现有用户名 ![] 发现数据库连接的配置信息, ...

  9. AutoGPT目前只是成功学大师GPT版

    一大波韭菜被收割了 最近很多人在交流对于AutoGPT的震惊和激动.AutoGPT是一个开源的应用程序,展示了GPT-4语言模型的能力.这个程序由GPT-4驱动,自主地开发和管理业务,以增加净值.它是 ...

  10. mysql数据库常见优化方法

    1,创建适当的索引(主键索引.唯一索引.普通索引.全文索引.空间索引). 2,对sql语句进行优化--->慢查询(explain). 3,使用分表技术(水平分表,垂直分表),分区技术. 4,读写 ...