从 HSQLDB 中的 TIMESTAMP WITH TIME ZONE 值中减去 UTC 偏移量
UTC offset subtracted from TIMESTAMP WITH TIME ZONE value in HSQLDB
我正在使用 HSQLDB 2.4.0,发现返回了意外的 TIMESTAMP WITH TIME ZONE
值。
我是运行以下代码,JVM时区为UTC+2
try (Connection connection = this.dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(
"SELECT '1960-01-01 23:03:20+02:00' "
+ "FROM (VALUES(0))");
ResultSet resultSet = preparedStatement.executeQuery()) {
OffsetDateTime expected = OffsetDateTime.parse("1960-01-01T23:03:20+02:00");
while (resultSet.next()) {
assertEquals(expected, resultSet.getObject(1, OffsetDateTime.class));
assertEquals("1960-01-01 23:03:20+02:00", resultSet.getObject(1, String.class));
}
}
第二个断言成功但第一个失败。我得到的不是预期的 1960-01-01T23:03:20+02:00
值 1960-01-01T21:03:20+02:00
,它比预期值早了两个小时。这是错误还是预期的行为?
编辑
经过更多调查,似乎减去的不是本地时区的 UTC 偏移量,而是 TIMESTAMP WITH TIME ZONE
的 UTC 偏移量。
如果我将 '1960-01-01 23:03:20+02:00'
更改为 CAST('1960-01-01 23:03:20+02:00' AS TIMESTAMP WITH TIME ZONE) + INTERVAL '2:00' HOUR TO MINUTE
,我会得到 1960-01-01T21:03:20+02:00
。同样 '1960-01-01 23:03:20+05:00'
有五个小时的休息时间,但 CAST('1960-01-01 23:03:20+02:00' AS TIMESTAMP WITH TIME ZONE) + INTERVAL '5:00' HOUR TO MINUTE
给了我 1960-01-01T21:03:20+05:00
.
这看起来像是一个已在下一个版本中修复的错误。您可以签出 SVN /base/trunk 代码并使用 Gradle 或 Ant.
进行编译
我正在使用 HSQLDB 2.4.0,发现返回了意外的 TIMESTAMP WITH TIME ZONE
值。
我是运行以下代码,JVM时区为UTC+2
try (Connection connection = this.dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(
"SELECT '1960-01-01 23:03:20+02:00' "
+ "FROM (VALUES(0))");
ResultSet resultSet = preparedStatement.executeQuery()) {
OffsetDateTime expected = OffsetDateTime.parse("1960-01-01T23:03:20+02:00");
while (resultSet.next()) {
assertEquals(expected, resultSet.getObject(1, OffsetDateTime.class));
assertEquals("1960-01-01 23:03:20+02:00", resultSet.getObject(1, String.class));
}
}
第二个断言成功但第一个失败。我得到的不是预期的 1960-01-01T23:03:20+02:00
值 1960-01-01T21:03:20+02:00
,它比预期值早了两个小时。这是错误还是预期的行为?
编辑
经过更多调查,似乎减去的不是本地时区的 UTC 偏移量,而是 TIMESTAMP WITH TIME ZONE
的 UTC 偏移量。
如果我将 '1960-01-01 23:03:20+02:00'
更改为 CAST('1960-01-01 23:03:20+02:00' AS TIMESTAMP WITH TIME ZONE) + INTERVAL '2:00' HOUR TO MINUTE
,我会得到 1960-01-01T21:03:20+02:00
。同样 '1960-01-01 23:03:20+05:00'
有五个小时的休息时间,但 CAST('1960-01-01 23:03:20+02:00' AS TIMESTAMP WITH TIME ZONE) + INTERVAL '5:00' HOUR TO MINUTE
给了我 1960-01-01T21:03:20+05:00
.
这看起来像是一个已在下一个版本中修复的错误。您可以签出 SVN /base/trunk 代码并使用 Gradle 或 Ant.
进行编译