给定ISO和时区字符串,如何在Java中将其转换为UTC字符串?

z4bn682m  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(149)

例如,我有一个ISO字符串“2022-12- 22 T18:20:00.000”和一个时区字符串“US/Eastern”,如何使用Java将它们转换为相同格式(ISO 8601)的UTC时间?

icnyk63a

icnyk63a1#

我不在电脑前测试但我想这个可能有用...

final ZonedDateTime usEastern =
            LocalDateTime.parse("2022-12-22T18:20:00.000", DateTimeFormatter.ISO_DATE_TIME)
                         .atZone(ZoneId.of("US/Eastern"));
    final ZonedDateTime utc = usEastern.withZoneSameInstant(ZoneId.of("UTC"));
xurqigkl

xurqigkl2#

accepted answer是正确的,但有几件事是重要的,为未来的游客到这个页面。

不需要指定DateTimeFormatter

java.time API基于ISO 8601,因此您无需指定DateTimeFormatter来解析已采用ISO 8601格式的日期-时间字符串(例如,您的日期-时间字符串2015-03-21T11:08:14.859831)。

ZonedDateTime中获取Instant

一旦将从给定日期时间字符串解析的LocalDateTime转换为ZonedDateTime,我建议您从ZonedDateTime中得到InstantInstant是时间轴上的瞬时点,通常使用UTC时间刻度表示。

* 美国/东部 * 已弃用

正如您在List of tz database time zones中所发现的,* US/Eastern * 已被弃用。我建议您避免使用 * US/Eastern *,而使用 * America/New_York *。

    • 演示**:
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;

class Main {
    public static void main(String[] args) {
        ZoneId zone = ZoneId.of("America/New_York");

        ZonedDateTime zdt = LocalDateTime.parse("2022-12-22T18:20:00.000")
                                         .atZone(zone);
        // Alternatively
        // zdt = ZonedDateTime.of(LocalDateTime.parse("2022-12-22T18:20:00.000"), zone);

        Instant instant = zdt.toInstant();
        System.out.println(instant);
    }
}
    • 输出**:
2022-12-22T23:20:00Z

ONLINE DEMO
从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

相关问题