除了显示时刻,我希望所有时间都以协调世界时(UTC)表示。在最后一刻,它们可以转换为本地时间仅用于显示。
我之前一直在MySQL中使用整数字段存储UNIX时间戳(自纪元以来的秒数)。现在我正在使用无法更改的其他人的数据库架构,其使用一个没有偏移量的DATETIME
存储原始时间。
我如何从数据库检索和发送时间对象到UTC,以便数据库不进行任何转换?
尽管是针对PostgreSQL编写的,但我试图遵循Basil Bourque在下面问题上的出色答案。我使用Instant
几乎在所有地方,但如他所示,在与JDBC交互时,我使用OffsetDateTime
,因为它是唯一受JDBC 4.2支持的现代时刻类。
我正在使用MySQL Connector/J驱动程序版本8.0.27,并使用&preserveInstants=false&connectionTimeZone=UTC
进行连接。
让我们来看看数据库中存储为“2022-01-14 11:00:00”的DATETIME
,这被理解为UTC。
resultSet.getString(columnName); // "2022-01-14 11:00:00"
resultSet.getObject(columnName, OffsetDateTime.class).toString() // "2022-01-14T11:00-04:00"
resultSet.getObject(columnName, OffsetDateTime.class).toInstant().toString() // "2022-01-14T15:00:00Z"
在创建
OffsetDateTime
时,它会分配系统或服务器(同一台机器)的偏移量为“-04:00”,这会导致一些混乱。我原以为连接选项&preserveInstants=false&connectionTimeZone=UTC
可以阻止这种情况发生。我知道我可以使用
.withOffsetSameLocal(ZoneOffset.UTC).toInstant()
立即将偏移设置为“+00:00”,但我要如何避免这样做,并直接创建一个在UTC中的OffsetDateTime
呢?