OffsetDateTime 到 ZonedDateTime - 带有特定的 ZoneId

Posted

技术标签:

【中文标题】OffsetDateTime 到 ZonedDateTime - 带有特定的 ZoneId【英文标题】:OffsetDateTime to ZonedDateTime - with specific ZoneId 【发布时间】:2019-01-31 13:48:22 【问题描述】:

我们创建了一个 DateTime 类,用于在我们的库中保存一个日期时间。该值通常来自 SQL 数据库(因此 UTC)或 XML(可以有偏移量)。但它也可以是具有明确时区的日期时间(如丹佛)。

在我们的类中,我们将其作为一个 OffsetDateTime ,我认为这是最好的,因为 98% 的时间我们都得到一个具有已知偏移量且没有区域的明确瞬间。

当它使用 ZonedDateTime 初始化时,我想我们将其保存为 OffsetDateTime 并保存 ZoneId。然后,仅在我们需要 ZonedDateTime 对象(转换为字符串以进行显示)的情况下,如果我们有 ZoneId,请将其应用于 OffsetDateTime.toZonedDateTime()。这样,在显示为字符串时,我们得到的“z”值是“MST”而不是“-0700”。

如何从 OffsetDateTime 创建具有特定 ZoneId 的 ZonedDateTime?

【问题讨论】:

atZoneSimilarLocal 不是您要找的吗? 几行代码比这种冗长的解释要容易得多。 【参考方案1】:

您提出的具体问题的解决方案;

ZoneId mst = ZoneId.ofOffset("UTC", ZoneOffset.ofHours(-7));
OffsetDateTime mstOffsetDateTime = OffsetDateTime.now(mst);
ZonedDateTime mstZonedDateTime = mstOffsetDateTime.atZoneSameInstant(mst);

但是,我不确定您为什么要将时间戳保存在 OffsetDateTime 中。如果您跟踪您的ZoneId,您可以在 UTC 中保存时间戳并在后端/前端(或任何其他客户端)中转换为您希望的任何格式。将日期时间存储为 UTC 将为您提供更大的灵活性。

【讨论】:

我们是一个图书馆,所以我们必须处理使用它的人扔给我们的东西。大多数设置 UTC 日期时间。但是相当数量的我们将日期时间设置为偏移量。还有一些设置为一个区域。我们必须处理所有案件。感谢您的回答。

以上是关于OffsetDateTime 到 ZonedDateTime - 带有特定的 ZoneId的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OffsetDateTime 属性测试数据类的相等性?

Spring Boot Rest - OffsetDateTime 作为浮点数返回

为啥 OffsetDateTime 序列化/反序列化结果有差异?

《日期与时间》第7节:ZonedDateTime与OffsetDateTime

我无法将 '2017-04-04T08:04+0000' 解析为 OffsetDateTime

在 SQLite 数据库中存储 java.time.OffsetDateTime 的推荐方法