提问人:F0cus 提问时间:4/25/2023 最后编辑:AnonymousF0cus 更新时间:4/28/2023 访问量:367
将带偏移量的时间戳转换为 UTC
Convert timestamp with offset to UTC
问:
转换
我有一个带有偏移量 () 的时间戳,格式如下:-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
我应该如何正确地做到这一点?
答:
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
解释
你的约会不仅仅是一个约会,它也有时间。所以行不通。如果有的话,那么.LocalDate
LocalDateTime
但是,它也不是本地日期/时间,它有偏移量信息。您需要改用,然后从那里转到。OffsetDateTime
Instant
要真正获得所需的输出,你还必须创建一个适当的 ,因为默认表示不包括毫。Instant
DateTimeFormatter
评论
2赞
Anonymous
4/25/2023
好答案。感谢您提供很好的解释。
4赞
deHaar
4/25/2023
#2
与 Zabuzard 发布的方法略有不同,因为没有明确使用......Instant
您将需要
- 解析 ,
String
- 调整偏移量从 UTC 到 UTC,然后
-06:00
- 通过以下方式获得所需的表示形式
String
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
评论
2赞
Anonymous
4/25/2023
发布的两个答案都非常好。我倾向于这个解决方案,对我来说,代码更清晰一些。
评论
OffsetDateTime
ZonedDateTime
Instant
BASIC_ISO_DATE
将接受。如您所见,这不是字符串的格式。也没有方法(上次我检查过)。20191130-0600
LocalDate
toInstant
Instant.parse()
Instant.parse(date).toString()
2019-11-30T06:01:00Z
.000
Instant
OffsetDateTime
toString