【问题标题】:How can I convert Java ZonedDateTime to OffsetDateTime with default time zone offset?如何使用默认时区偏移量将 Java ZonedDateTime 转换为 OffsetDateTime?
【发布时间】:2018-10-30 19:35:48
【问题描述】:

假设我的 ZonedDateTime 为 2018-10-30T18:04:58.874Z : 如何将其转换为 OffsetDateTime 2018-10-30T13:04:58.874-05:00

我希望偏移量是默认/系统偏移量,例如从OffsetDateTime.now() 中提取。

【问题讨论】:

  • 你认为ZonedDateTime的哪些方法在这里有用?

标签: java java-time


【解决方案1】:

从您的ZonedDateTime 中,您需要指定您希望您的OffsetDateTime 在哪个其他区域,精确区域,然后他们使用.toOffsetDateTime()

ZonedDateTime z = ZonedDateTime.parse("2018-10-30T18:04:58.874Z");
System.out.println(z); //2018-10-30T18:04:58.874Z

OffsetDateTime o = z.withZoneSameInstant(ZoneId.of("UTC-5")).toOffsetDateTime();
System.out.println(o); //2018-10-30T13:04:58.874-05:00

【讨论】:

    【解决方案2】:

    这会将时区从当前/现在转移:

    someOffsetDateTime.withOffsetSameInstant(OffsetDateTime.now().getOffset())
    

    【讨论】:

    • 这在我看来通常是错误的:如果 DST 发生并且 now() 和分析下的实际日期可能需要不同的偏移量,偏移量可能会改变
    【解决方案3】:

    我认为正确的做法如下:

    ZonedDateTime date = ZonedDateTime.parse("2018-10-30T18:04:58.874Z");
    ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(date.toInstant());
    ZonedDateTime dateInMyZone = date.withZoneSameInstant(offset)
    

    从 now() 获取它会给你一个可能错误的结果,因为偏移量可能会因 DST 而在一年中发生变化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-27
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 2021-10-16
      • 2022-06-17
      相关资源
      最近更新 更多