【发布时间】:2020-05-20 17:56:42
【问题描述】:
我有一个 Oracle 数据库,它提供+00:00 查询结果:
从对偶中选择 dbTimezone;
我想在我的 Java 应用程序中使用任何日期/时间始终为 UTC。
我使用的表有一个Date 类型的列,它从sysdate 获取默认值。
即使我使用-Duser.timezone=UTC 运行我的应用程序,但当我插入此表并使用rs.getTimestamp("DATE_CREATED") 读取此Date 列时,它比预期的当前UTC 时间多一小时:
Expected current UTC: 2020-02-04 20:38:12.0
Actual: 2020-02-04 21:38:12.0
我还注意到 select current_date from dual 而不是 sysdate 将导致预期的当前 UTC 时间。我应该将此列的默认值从 sysdate 更改为 current_date (alter table MY_TABLE modify DATE_CREATED default current_date) 还是有其他方法可以在 Java 应用程序中配置时区而不更改数据库设置?
【问题讨论】:
-
我强烈建议您使用 java.time 而不是 java.sql.Timestamp。调用 getObject("DATE_CREATED", java.sql.LocalDateTime.class) 读取 TIMESTAMP 值。请注意,根据 SQL 规范,TIMESTAMP 值没有时区。
-
@DouglasSurber 谢谢!与您的建议相比,
resultSet.getTimestamp().toLocalDateTime()有什么缺点吗? -
@WernfriedDomscheit 这非常有用。现在我明白为什么
sysdate显示错误的 GMT+0 时间(它应该与 UTC 匹配,但在我的示例中不匹配)。dbTimezone与sysdate无关!sysdate依赖于 db 的服务器操作系统 -
@Kirill,抱歉回复晚了。 resultSet.getTimestamp(n).toLocalDateTime() 进行两次转换。 resultSet.getObject(n, LocalDateTime.class) 只做一个。此外,使用 getTimestamp 时会出现涉及系统时区的复杂情况,而使用 getObject(n, LocalDateTime.class) 时可以避免这些复杂情况。后者具有更好、更清晰的规范。
标签: java oracle jdbc timezone ojdbc