【问题标题】:UTC Unix timestamp storage in HSQLDB from Java program in wrong timezone来自Java程序的HSQLDB中的UTC Unix时间戳存储在错误的时区
【发布时间】:2015-12-09 11:06:17
【问题描述】:

我试图了解如何在 HSQLDB 嵌入式文件数据库中存储 Unix timestamp(即自 1970 年以来以 UTC/GMT 时区表示的秒数)。但是,我还没有理解 TZ 处理如何与 HSQL 一起工作。

我的程序将在不同的区域使用,因此必须使用 UTC。此外,我无法更改默认时区(如java.util.TimeZone.setDefault),因为它将嵌入到其他程序中,因此不应更改环境。

我的尝试 - 文档指出:

当使用 PreparedStatement 或 CallableStatement 接口将日期时间值发送到数据库时,Java 对象将转换为准备好的或可调用语句参数的类型。此类型可以是 DATE、TIME 或 TIMESTAMP(带或不带时区)。时区位移是JDBC会话的时区。

所以我在数据库中使用了一个 TIMESTAMP 列(没有时区 - 默认值),然后发出 SET TIME ZONE INTERVAL '0:00' HOUR TO MINUTE(将会话置于 UTC TZ 中),然后发出 INSERT INTO TEST VALUES(?) 和 ?是一个 Java Timestamp 对象,包含正确的 Unix 值(GMT 相关,测试OK)。

遗憾的是,在这种情况下,数据库的 SQL 日志显示时间戳已恢复为我的本地时区 (+2)。对于 1442132237635 的时间戳(UTC 为 8H17,+2 为 10H17),我们在日志中得到 TIMESTAMP'2015-09-13 10:17:17.602000'。错误的结果...似乎更改会话时区绝对没有任何影响(我尝试过+14,-14 ...没有更改)。然而,SET 命令被正确执行 - 它出现在 SQL 日志中,之后 TIMEZONE() 的值发生变化。

其他尝试

我还尝试使用 TIMESTAMP WITH TIME ZONE 列,而不设置会话 TZ。在这种情况下,数据库存储“本地时间+2”,我可以从中提取正确的时间戳。这太荒谬了——这意味着 HSQLDB 驱动程序采用 Java 时间戳 (UTC),将其正确解释为 UTC,将其转换为 JVM 默认 TZ,然后将其发送到数据库。我不想要数据库中的 TZ 信息 - 不需要它。 (注意:更改会话 TZ 没有影响 - 发出的 SQL 命令始终与我的本地 TZ 一起...让您想知道 SET TZ 命令的意义何在)

将默认 JVM TZ 更改为 UTC 可以,但如上所述,我不能这样做。

还要注意:this question 似乎相关,但提供的答案基本上是破解我想避免的每个 SQL 订单......

我的问题

如何将我的 UTC Java 时间戳简单地存储在 HSQLDB 中? SET TIME ZONE 命令的目的是什么?

感谢阅读。

【问题讨论】:

    标签: java date timezone hsqldb utc


    【解决方案1】:

    您的第一次尝试是正确的,将返回正确的结果。

    您的数据库位于 UTC+2 时区。您正在连接,就像您是 UTC 时区的远程用户一样。

    时间戳的日志存储没有你所说的错误。日志存储不是供数据库用户读取的。数据库将其日志存储在您所在位置的时区中。下次它读取它读取的日志并根据您的数据库时区解释它(与会话时区无关)。因此,日志中存储为 10:17 的时间将是 UTC 的 8:17。

    使用 TIMESTAMP WITHOUT TIME ZONE,无法将数据库文件移动到不同的时区,因为时间戳将根据新位置的时区进行解释。

    SET TIME ZONE 语句的作用是允许在存储数据时进行正确的调整。它不会更改以前存储的数据。自然,如果时间存储为 8:17,则无论何时何地在哪个区域访问它,都应将其读取为 8:17。

    为了获得最佳可移植性,请使用 TIMESTAMP WITH TIME ZONE。即使您移动数据库文件,它存储和检索数据的方式也是正确的。

    【讨论】:

    • 非常感谢,感谢您的正确和发现了一年前的问题。我确实没有考虑数据库本身的时区。
    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 2011-03-23
    • 2019-01-27
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多