【发布时间】:2019-07-07 01:42:21
【问题描述】:
我有时区相关的问题。
我在 JAVA 和 MySql 数据库中有一个程序。 我不使用任何 ORM,但我有自定义 jdbc 库,它使用 mysql 连接器 java v 6.0.4
我将设置作为连接字符串的一部分发送为:
serverTimezone - America/Chicago
useTimezone - true
useJDBCCompliantTimezoneShift - false
useLegacyDatetimeCode - false
我尝试从数据库中选择一个日期,例如2019-02-13。
数据库位于美国/东部时区,运行 java 程序的服务器位于美国/芝加哥时区。
无法更改任何服务器的位置/时区。
在 Java 中,我得到一个倒退一天的日期 (2019-02-12)。
问题是由于时间戳引起的 -
1550034000 在美国/东部是 2019-02-13 00:00:00
但是
1550034000 在美国/芝加哥是 2019-02-12 23:00:00
所以结果我有java.sql.Date 对象,日期为2019-02-12。
添加时区偏移量没有任何帮助,因为时间信息已从日期中截断。
您能否提出一些解决方案,说明如何在不改变时区的情况下获得正确的日期?
编辑:我正在使用serverTimezone 设置,但我不确定该值是否应该是数据库正在使用的时区,或者它只是覆盖运行应用程序的 JVM/服务器的时区。
【问题讨论】:
-
显示代码(插入和选择)?显示表结构,明确日期对象的类型。
-
Check this out 因为它可以给你一些线索。
-
它可能需要修改您的自定义 JDBC 库,但如果列数据类型是
date,则检索到LocalDate,而不是java.sql.Date。后者存在设计问题(正如您所遇到的,但不限于此)并且早已过时。LocalDate来自 java.time, the modern Java date and time API。现代 API 更易于使用。 -
@danblack 我能够通过简单的选择来模拟问题 - SELECT CURDATE() as 'date';
-
您是否能够修改您的自定义 JDBC 库以返回
java.time.LocalDate而不是(或除了)java.sql.Timestamp吗?
标签: java mysql date jdbc timezone