1

我需要将当前时间作为字符串存储在数据库中。时间可以在不同的时区,所以我正在考虑使用 Java SE 8 的新 ZonedDateTime 类。

我注意到 toString() 方法会自动输出:

2016-04-15T17:40:49.305-05:00[America/Chicago]

这似乎也可以被 ZonedDateTime.parse() 读取并转换为正确的值。

如果我所做的只是存储这些值并且我不需要将值转换为用户可读的格式,那么我需要做的就是准确地存储具有适当时区的数据吗?例如,如果我通过存储它们的 toString() 表示将两个 ZonedDateTimes 插入到 SQL 数据库中,然后我使用 ZonedDateTime.parse() 读取这些时间,我是否可以期望 isAfter() 和 isBefore() 之类的东西正常工作美好的?

还是我错过了两者之间的一步?在试图找出 Java 7 中的时区之后,这感觉太容易了。

4

2 回答 2

2

一般来说,我会避免依赖解析toString()应用程序中任何类的表示。 toString()旨在提供类的人类可读版本,因此它可能会从发布版本更改为发布版本。

我建议您强制格式为您期望的格式,例如应用:

String toStoreInDb = DateTimeFormatter.ISO_ZONED_DATE_TIME.format(zonedDateTime);
...
ZonedDateTime fromDb = 
ZonedDateTime.parse(stringFromDb, DateTimeFormatter.ISO_ZONED_DATE_TIME);

这样,您的应用程序将抵制任何toString()更改。此外看看这个错误: ZonedDateTime.parse() 中的错误

于 2017-05-11T21:31:46.060 回答
1

是的,这将准确地存储日期,并且使用 .parse() 方法将允许您使用 ZoneDateTime 的其他方法。虽然如果您希望能够在您的数据库中使用排序功能,那么您将需要手动将 ZonedDateTime 转换为时间戳或使用您的 ORM 的功能为您完成。

于 2016-10-14T13:02:18.197 回答