我有一个简单的 id 的 Postgres 测试表,带有时区的时间戳。下面的测试和输出应该是不言自明的,但总而言之,我插入了一个带有 -6 偏移量的时间戳的行。它被正确地插入到数据库中,然后以相同的时间从数据库中加载出来,但是偏移量错误,特别是 Z 而不是 -6。
我尝试将我的数据库设置为 UTC,当我在命令行手动选择时,它会正确显示 UTC 时间。将数据库设置为山,它显示预期时间,偏移量为 -6。
通过在 jOOQ 中执行的语句将数据库强制到不同的时区似乎无济于事。
context.execute( "set timezone TO 'GMT';" ); // this has no effect
强制我的系统时间为 UTC 有效地解决了这个问题,但由于许多原因是不可接受的。
TimeZone.setDefault( TimeZone.getTimeZone( "UTC" ) ); // this is a band aid that works, but is not sustainable
这是单元测试:
@Test
public void confirmDateRoundTripFromDb() throws SQLException, DatatypeConfigurationException
{
ZonedDateTime testDate = ZonedDateTime.of( 2019, 05, 30, 12, 54, 32, 203, TimeUtilities.CENTRAL_ZONEID );
final OffsetDateTime testDateAsOffset = testDate.toOffsetDateTime( );
try( PGConnection dbConnection = DatabaseUtility.getPostgresConnection( _unitTestConfig.getSection("Postgres").getProperties(), _testDbName ) )
{
DSLContext context = DSL.using( dbConnection, SQLDialect.POSTGRES );
DateTestsRecord dateTestsRecord = context.newRecord( DATE_TESTS );
dateTestsRecord.setTestTimestamp( testDateAsOffset );
dateTestsRecord.store();
int id = dateTestsRecord.getId();
DateTestsRecord insertedRecord = context.selectFrom( DATE_TESTS ).where( DATE_TESTS.ID.eq( id ) ).fetchAny();
System.out.println( testDateAsOffset );
System.out.println( insertedRecord.getTestTimestamp() );
}
}
和输出:
2019-05-30T12:54:32.000000203-05:00
2019-05-30T11:54:32Z
有趣的是,如果我在中央添加一个日期,小时会正确更改为山区,但往返后的输出仍然只是愉快地报告 Z。
我认为这不是预期的?难道我做错了什么?如果没有,有什么想法可以在全球范围内适用的解决方法吗?在这方面有几个开发人员,我对每次选择时都必须用一些特殊的逻辑处理日期并不感到兴奋,这似乎很脆弱。
我一直在运行 3.10,但刚刚升级到 3.12,结果相同。