[数据库]时区及JDBC的时区设置

科技资讯 投稿 8400 0 评论

[数据库]时区及JDBC的时区设置

数据库 部署方式 版本 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

 

 

 

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

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

数据库中存储的数据:

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

总结:

实例2:

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

数据库中存储结果:

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数据类型。来保证获取时间时时区的正确性。

 

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

编程笔记 » [数据库]时区及JDBC的时区设置

赞同 (48) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽