【发布时间】:2021-12-10 07:27:04
【问题描述】:
我有一个使用 Spring JDBC 将数据存储到 Oracle 中的 java 应用程序。数据包括我们在未来查询某些数据时使用的时间戳/日期。
日期字段在 DDL SQL 文件中的定义如下:
JobExecution {
START_TIME TIMESTAMP DEFAULT NULL ,
END_TIME TIMESTAMP DEFAULT NULL
...
}
更新这些字段的 Java 代码如下所示:
lastJobExecution.setEndTime(new Date(System.currentTimeMillis()));
new Date(System.currentTimeMillis()) 按照以下文档以 UTC 格式存储当前时间。 System.currentTimeMillis() 的文档说它返回以下内容:
当前时间和当前时间之间的差异,以毫秒为单位 UTC 时间 1970 年 1 月 1 日午夜。
Date 的文档说明如下:
分配一个 Date 对象并初始化它以表示指定的 自标准基准时间以来的毫秒数,称为“ 纪元”,即 1970 年 1 月 1 日 00:00:00 GMT。
参数:日期 - 自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒数。 另见:System.currentTimeMillis()
但是,当我使用 SQL developer 连接到 oracle 数据库时,日期似乎是按照本地时间而不是 UTC 存储的。
问题:
- Oracle
TIMESTAMP是否根据当地时间调整日期?我在 Oracle 文档的任何地方都找不到明确的说明。 - 如果是,最好的处理方法是什么。一种方法是每次我从该表中读取数据时将其转换为 UTC。另一种方法是将其存储为 UTC 格式本身。
【问题讨论】:
-
阅读this oracle documentation 似乎
TIMESTAMP存储时间信息而没有进一步的时区信息,即它只存储给出的任何信息。要存储在本地时区,我们将使用TIMESTAMP WITH LOCAL TIME ZONE。 -
@MarkRotteveel 它确实部分回答了我的问题。但是,不同之处在于 java 代码可能就是我将数据存储到 Oracle 中的方式。我正在使用 spring JDBC 来存储将日期转换为 TIMESTAMP 数据类型的中间步骤,至少我并不清楚。
-
最好的办法可能是改用
java.time.LocalDateTime而不是java.util.Date/java.sql.Timestamp。 -
@Turing85 似乎并非如此。我更新了 Date 和 System.currentTimeMillis 的文档。它们以 UTC 格式生成日期。所以在某处似乎日期是根据当地时区转换/调整的。