【发布时间】:2017-06-09 20:44:24
【问题描述】:
美好的一天,
我创建了将在全球范围内使用的 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
【问题讨论】:
-
撇开小数秒问题不谈,为什么不使用
Instant将时间戳存储为UTC? -
我刚做的一大早,虽然有疑问。你用你的问题把它们抹掉了,谢谢。我不想编辑我的答案,因为它不会影响分数行为,并且仍然想查看其他关于类型的命题,例如,就像你写的那样。
标签: java mysql time timezone zoneddatetime