【发布时间】:2022-01-14 22:44:57
【问题描述】:
我更喜欢所有时间都使用 UTC,除了显示时间。在最后一刻,它们可以转换为本地时间,仅用于显示。
我之前一直在 MySQL 中将 UNIX 时间戳(自纪元以来的秒数)存储在一个整数字段中。我正在使用其他人的数据库架构,我无法更改它使用 DATETIME 存储原始时间甚至没有偏移量。
如何在 UTC 中使用数据库检索和发送时间对象,这样数据库绝对不会进行任何转换?
虽然是为 PostgreSQL 编写的,但我尝试遵循 Basil Bourque 对以下问题的出色回答。我在任何地方都使用Instant,除非他表明我在与 JDBC 交互时使用OffsetDateTime,因为它是唯一保证受 JDBC 4.2 支持的现代 moment 类。
- How to convert UTC date to UTC OffsetDateTime in java 8?
- Issue in saving current date with UTC time in sql server
- 和How to save correct date time with timezone when using jdbc
我正在使用 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?
【问题讨论】:
标签: java mysql datetime jdbc offsetdatetime