【问题标题】:How to convert OffsetTime to local OffsetTime?如何将 OffsetTime 转换为本地 OffsetTime?
【发布时间】:2015-03-23 10:27:23
【问题描述】:

为了处理OffsetTime,我想将其转换为本地OffsetTime。例如,如果系统默认偏移量为+1:00,则将14:03:04.708-01:00 转换为16:03:04.708+01:00

我该怎么做?

【问题讨论】:

    标签: java datetime time java-8 datetimeoffset


    【解决方案1】:

    使用OffsetTime.withOffsetSameInstant:

    OffsetTime input = OffsetTime.of(14, 3, 4, 708000000, ZoneOffset.ofHours(-1));
    System.out.println(input);
    
    OffsetTime output = input.withOffsetSameInstant(ZoneOffset.ofHours(1));
    System.out.println(output);
    

    【讨论】:

    • 这个硬编码,而不是采用系统默认值。
    • 谢谢,这让我领先一步。然而,它仍然使用 ZoneOffset 常量而不是系统默认值。
    • OffsetTime.now().getOffset() 获取系统默认偏移量的唯一方法吗?
    • 问题是使用 DST 的区域在冬季和夏季有不同的偏移量
    【解决方案2】:

    正如@Jesper 的回答正确地说明了更改OffsetTime 实例上的偏移量的方法,而不更改它指向的Instant 是通过调用withOffsetSameInstant

    困难的部分是确定系统的默认偏移量。系统没有默认偏移量,它有一个默认的ZoneIdZoneId 有一个偏移量,但如果应用 DST,这可能会在全年发生变化。

    您的问题不清楚我们是否可以确定一年中的哪个时间与您的用例相关。现在可能对您的用例有效。可能是您有一个 LocalDate 来评估 OffsetTime。如果是这种情况,您可以像这样获得系统默认值:

        LocalDateTime localDateTime = LocalDateTime.of(localDate, offsetTime.toLocalTime());
        ZoneOffset offset = ZoneId.systemDefault().getRules().getOffset(localDateTime);
    

    【讨论】:

      【解决方案3】:
      1. 现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter 对象。
      2. 观察DST 的地方的时区偏移量根据夏季/冬季时间而变化。因此,如果您所在的地方遵守 DST,则不应使用固定的时区偏移量,例如+01:00 小时;相反,您应该从 API 中获取它。

      演示:

      import java.time.OffsetTime;
      import java.time.ZoneId;
      import java.time.ZoneOffset;
      import java.time.ZonedDateTime;
      
      public class Main {
          public static void main(String[] args) {
              String strTime = "14:03:04.708-01:00";
      
              OffsetTime parsedOffsetTime = OffsetTime.parse(strTime);
              System.out.println(parsedOffsetTime);
      
              OffsetTime offsetTimeAtOffset0100 = parsedOffsetTime.withOffsetSameInstant(ZoneOffset.of("+01:00"));
              System.out.println(offsetTimeAtOffset0100);
      
              // Time at JVM's default timezone offset
              ZoneOffset jvmTzOffset = ZonedDateTime.now(ZoneId.systemDefault()).getOffset();
              OffsetTime offsetTimeAtJvmTzOffset = parsedOffsetTime.withOffsetSameInstant(jvmTzOffset);
              System.out.println(offsetTimeAtJvmTzOffset);
          }
      }
      

      输出:

      14:03:04.708-01:00
      16:03:04.708+01:00
      16:03:04.708+01:00
      

      注意:我的时区是Europe/London,当前偏移量为01:00 小时。

      Trail: Date Time了解更多关于java.timemodern Date-Time API*的信息。


      * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

      【讨论】:

        猜你喜欢
        • 2017-08-06
        • 1970-01-01
        • 2020-04-29
        • 2015-05-26
        • 2019-10-15
        • 2017-06-26
        • 2011-01-19
        • 2013-08-13
        • 2019-07-05
        相关资源
        最近更新 更多