美好的一天,
我创建了将在全球范围内使用的 Web 应用程序服务。
因此,我需要以 UTC 格式存储日期时间值,并将它们以挂钟时间的时钟表示给最终用户。
阅读堆栈溢出后,我明白,我应该:
- 使用时间戳作为 DB 中的列类型(当前为 MariaDB 10.1.20)
- 在 Java 中使用 ZonedDateTime(我使用 java8)
在这些值之间进行转换时出现了问题。
当我使用 JDBC 时,我必须进行以下转换:
java.sql.Timestamp <-> java.time.ZonedDateTime
我的代码:
// Get current zonedDateTime
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
// Convert zonedDateTime to java.sql.Timestamp before saving to DB
Timestamp = Timestamp.from(zonedDateTime.toInstant());
// Get zonedDateTime from resultSet
Timestamp timestamp = (Timestamp) resultSet.getObject("created");
ZonedDateTime zonedDateTime =
ZonedDateTime.ofInstant(ts.toInstant(), ZoneOffset.UTC))
当我使用:
zonedDateTimeBeforeSave.isEqual(zonedDateTimeAfterSave);
它返回我错误(我需要在我的域模型的覆盖相等方法中比较它们)
下面是两者的打印:
zonedDateTimeBeforeSave: 2017-01-24T20:18:17.720Z
zonedDateTimeAfterSave: 2017-01-24T20:18:17Z
问题:
- 我的选择是否正确。也许,我应该使用另一列或 java 类型...
- 我做转换是否正确。也许还有另一种更好的方法
谢谢
- 编辑:在马特约翰逊的帮助下,我明白问题出在事实上,当我将日期时间保存到数据库时,它不会保存分数,尽管它应该。仅供参考,列类型是时间戳(6)。
- 编辑:现在我使用 java.time.Instant 而不是 ZonedDateTime