【问题标题】:OffsetDateTime to ZonedDateTime - with specific ZoneIdOffsetDateTime 到 ZonedDateTime - 带有特定的 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 不是您要找的吗?
  • 几行代码比这种冗长的解释要容易得多。

标签: java java-time


【解决方案1】:

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

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

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

【讨论】:

  • 我们是一个图书馆,所以我们必须处理使用它的人扔给我们的东西。大多数设置 UTC 日期时间。但是相当数量的我们将日期时间设置为偏移量。还有一些设置为一个区域。我们必须处理所有案件。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2018-02-23
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
相关资源
最近更新 更多