代码之家  ›  专栏  ›  技术社区  ›  user_che_ban

将带偏移量的时间戳转换为UTC

  •  3
  • user_che_ban  · 技术社区  · 2 年前

    转变

    我有一个带偏移量的时间戳( -6 )格式如下:

    2019-11-30T00:01:00.000-06:00
    

    我想将其转换为UTC时间戳,例如:

    2019-11-30T06:01:00.000Z
    

    企图

    我尝试了以下方式:

    String text = "2019-11-30T00:01:00.000-06:00";
    
    LocalDate date = LocalDate.parse(text, DateTimeFormatter.BASIC_ISO_DATE);
    
    System.out.println(date.toInstant());
    

    但它没有编译:

    方法 toInstant() 对于类型未定义 LocalDate

    我应该如何正确地做到这一点?

    2 回复  |  直到 2 年前
        1
  •  3
  •   Zabuzard Louis-Philippe Lebouthillier    2 年前

    tl;博士

    String text = "2019-11-30T00:01:00.000-06:00";
    OffsetDateTime offsetDateTime = OffsetDateTime.parse(text);
    Instant instant = offsetDateTime.toInstant();
    
    System.out.println(instant); // 2019-11-30T06:01:00Z
    
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
      .withZone(ZoneOffset.UTC);
    System.out.println(formatter.format(instant)); // 2019-11-30T06:01:00.000Z
    

    解释

    你的 日期 不仅仅是约会,它还有时间。所以 LocalDate 不会起作用。如果有的话,那么 LocalDateTime

    但是,它也不是 地方的 日期/时间,它有偏移信息。你需要使用 OffsetDateTime 相反,然后转到 Instant 从那里。

    为了实际获得所需的输出 瞬间 ,您还必须创建一个适当的 DateTimeFormatter ,因为默认表示不包括毫。

        2
  •  3
  •   deHaar    2 年前

    由于没有使用 Instant 明确地

    你需要

    • 解析 String ,
    • 调整偏移 -06:00 到UTC,然后
    • 得到想要的 一串 通过 DateTimeFormatter

    所以 tl;博士 以下为:

    public static void main(String[] args) {
        // example input
        String someDateTime = "2019-11-30T00:01:00.000-06:00";
        // parse directly
        OffsetDateTime odt = OffsetDateTime.parse(someDateTime);
        // define a DateTimeFormatter for the desired output
        DateTimeFormatter dtf = DateTimeFormatter
                                    .ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX");
        // print the parsing result using the DateTimeFormatter
        System.out.println("Origin: " 
                + odt.format(dtf));
        // adjust the offset from -06:00 to UTC
        OffsetDateTime utcOdt = odt.withOffsetSameInstant(ZoneOffset.UTC);
        // print the result — again using the DateTimeFormatter
        System.out.println("UTC:    " 
                + utcOdt.format(dtf));
    }
    

    输出:

    Origin: 2019-11-30T00:01:00.000-06:00
    UTC:    2019-11-30T06:01:00.000Z