Java 从时间戳中减去UTC偏移量,时区值以HSQLDB为单位

Java 从时间戳中减去UTC偏移量,时区值以HSQLDB为单位,java,jdbc,timezone,hsqldb,timestamp-with-timezone,Java,Jdbc,Timezone,Hsqldb,Timestamp With Timezone,我正在使用HSQLDB2.4.0,并看到返回了带有时区值的意外时间戳 我使用UTC+2的JVM时区运行以下代码 try (Connection connection = this.dataSource.getConnection(); PreparedStatement preparedStatement = connection.prepareStatement( "SELECT '1960-01-01 23:03:20+02:00' "

我正在使用HSQLDB2.4.0,并看到返回了带有时区值的意外
时间戳

我使用UTC+2的JVM时区运行以下代码

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
。这是一个bug还是预期的行为

编辑

经过进一步调查,似乎不是本地时区的UTC偏移量,而是带有时区的时间戳的UTC偏移量


如果我将
'1960-01-01 23:03:20+02:00'
更改为
CAST('1960-01-01 23:03:20+02:00'作为带时区的时间戳)+间隔'2:00'小时到分钟
我得到
1960-01-01T21:03:20+02:00
。同样地,
'1960-01-01 23:03:20+05:00'
也有五个小时的休息时间,但是
将('1960-01-01 23:03:20+02:00'作为带时区的时间戳)+时间间隔'5:00'每分钟
给了我
1960-01-01T21:03:20+05:00
这看起来像是一个在下一版本中修复的错误。您可以签出SVN/base/trunk代码,并使用Gradle或Ant进行编译