我更喜欢所有时间都在 UTC,除了它们显示的时候。在最后一刻,它们可以转换为本地时间,仅用于显示。
我以前总是在 MySQL 中存储 unix 时间戳(自纪元以来的秒数),在整数字段中。我正在使用其他人的数据库架构,我无法更改它使用DATETIME
存储原始时间甚至没有偏移量的数据库架构。
如何使用 UTC 格式的数据库检索和发送时间对象,因此数据库绝对不进行任何转换?
虽然是为 PostgreSQL 编写的,但我尝试遵循 Basil Bourque 在以下问题上的出色回答。我Instant
在任何地方都使用,除非他显示我OffsetDateTime
在与 JDBC 交互时使用 an,因为它是唯一保证受 JDBC 4.2 支持的现代 moment 类。
我正在使用 MySql Connector/J 8.0.27,并且正在使用&preserveInstants=false&connectionTimeZone=UTC
.
让我们看一下DATETIME
数据库中存储为“2022-01-14 11:00:00”的 a,它被理解为 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
应该已经停止了。
我知道我可以立即将偏移量设置为“+00:00” .withOffsetSameLocal(ZoneOffset.UTC).toInstant()
,但是我如何避免这样做并让它直接创建一个OffsetDateTime
UTC 格式的?