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

Convert timestamp with offset to UTC

提问人:F0cus 提问时间:4/25/2023 最后编辑:AnonymousF0cus 更新时间:4/28/2023 访问量:367

问:

转换

我有一个带有偏移量 () 的时间戳,格式如下:-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

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

UTC java-time java.time.instant offsetdatetime

评论

3赞 Zabuzard 4/25/2023
你的约会不仅仅是一个约会,它也有时间。它也不是本地日期/时间,它有偏移量信息。您可能打算将此文本解析为 或 ,然后转到 。OffsetDateTimeZonedDateTimeInstant
0赞 Anonymous 4/25/2023
BASIC_ISO_DATE将接受。如您所见,这不是字符串的格式。也没有方法(上次我检查过)。20191130-0600LocalDatetoInstant
1赞 Anonymous 4/25/2023
在较新的 Java 版本中,直接接受您的字符串。 收益 率。Instant.parse()Instant.parse(date).toString()2019-11-30T06:01:00Z
3赞 Anonymous 4/25/2023
@Zabuzard 非常好的编辑!谢谢。user_che_ban,这是否可以作为您下一个 Stack Overflow 问题的灵感?
1赞 Anonymous 4/25/2023
您确定需要零秒的分数吗?您要求 ISO 8601 格式,而在 ISO 8601 中,分数为零时是可选的。所以你的字符串的接收者可能不在乎。询问是因为 java.time ( 和 ) 的类从它们的方法打印 ISO 8601,但仅当它不为零时才包含秒的分数。.000InstantOffsetDateTimetoString

答:

4赞 Zabuzard 4/25/2023 #1

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

解释

你的约会不仅仅是一个约会,它也有时间。所以行不通。如果有的话,那么.LocalDateLocalDateTime

但是,它也不是本地日期/时间,它有偏移量信息。您需要改用,然后从那里转到。OffsetDateTimeInstant

要真正获得所需的输出,你还必须创建一个适当的 ,因为默认表示不包括毫。InstantDateTimeFormatter

评论

2赞 Anonymous 4/25/2023
好答案。感谢您提供很好的解释。
4赞 deHaar 4/25/2023 #2

与 Zabuzard 发布的方法略有不同,因为没有明确使用......Instant

您将需要

  • 解析 ,String
  • 调整偏移量从 UTC 到 UTC,然后-06:00
  • 通过以下方式获得所需的表示形式StringDateTimeFormatter

所以。。。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

评论

2赞 Anonymous 4/25/2023
发布的两个答案都非常好。我倾向于这个解决方案,对我来说,代码更清晰一些。