【问题标题】:Java 8 timezone conversionsJava 8 时区转换
【发布时间】:2014-11-11 04:42:02
【问题描述】:

在 Java 8 中,我想将日期时间从 UTC 转换为 ACST (UTC+9:30)。

输入 -> 2014-09-14T17:00:00+00:00

输出-> 2014-09-15 02:30:00

String isoDateTime = "2014-09-14T17:00:00+00:00";
LocalDateTime fromIsoDate = LocalDateTime.parse(isoDateTime, DateTimeFormatter.ISO_OFFSET_DATE_TIME);

ZoneOffset offset = ZoneOffset.of("+09:30");
OffsetDateTime acst = OffsetDateTime.of(fromIsoDate, offset);
System.out.println(acst.toString()); // 2014-09-14T17:00+09:30
System.out.println(acst.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); // 2014-09-14T17:00:00+09:30

为什么不执行偏移?

【问题讨论】:

    标签: java timezone java-8 timezone-offset


    【解决方案1】:

    试试:

    String isoDateTime = "2014-09-14T17:00:00+00:00";
    ZonedDateTime fromIsoDate = ZonedDateTime.parse(isoDateTime);
    ZoneOffset offset = ZoneOffset.of("+09:30");
    ZonedDateTime acst = fromIsoDate.withZoneSameInstant(offset);
    
    System.out.println("Input:  " + fromIsoDate);
    System.out.println("Output: " + acst.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); 
    

    输出:

    Input:  2014-09-14T17:00Z
    Output: 2014-09-15T02:30:00+09:30
    

    使用OffsetDateTime

    虽然如上所示使用ZonedDateTime 通常更好,但您可以使用OffsetDateTime 执行相同的转换,如下所示:

    String isoDateTime = "2014-09-14T17:00:00+00:00";
    OffsetDateTime fromIsoDate = OffsetDateTime.parse(isoDateTime);
    ZoneOffset offset = ZoneOffset.of("+09:30");
    OffsetDateTime acst = fromIsoDate.withOffsetSameInstant(offset);
    

    【讨论】:

      【解决方案2】:

      对上述内容略有改进。避免硬编码偏移。此外,还要注意夏令时。

      public static LocalDateTime convertTo(LocalDateTime dateTime, String timeZone) {
          ZoneId zone = ZoneId.of(timeZone);
          ZonedDateTime zdt = dateTime.atZone(zone);
          ZoneOffset offset = zdt.getOffset();
          return dateTime.plus(offset.getTotalSeconds(), ChronoUnit.SECONDS);
      }
      

      【讨论】:

      • 这是一种反模式,您不应该在时区转换后返回“Local”DateTime。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多