将 ZonedDateTime 转换为字符串

Converting ZonedDateTime to string

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

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

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

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

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

还是我错过了中间的一步?在尝试找出 Java 7 中的时区后,这感觉太简单了。

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

一般来说,我会避免依赖于解析我的应用程序中任何 class 的 toString() 表示。 toString() 旨在提供一个 class 的人类可读版本,因此它可能会随着版本的不同而有所变化。

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

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

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