Java 8将给定的时间和时区转换为UTC时间

Java 8将给定的时间和时区转换为UTC时间,java,java-8,utc,java-time,Java,Java 8,Utc,Java Time,我喜欢字符串类型:“2015-01-05 17:00”,ZoneId是“澳大利亚/悉尼” 如何使用Java 8 datetime API将此时间信息转换为相应的UTC时间 还需要考虑DST的内容。您正在寻找Java8中的ZoneDateTime类-一个完整的日期时间,带有时区,并解决了UTC/格林威治的偏移。就设计而言,该类主要应被视为LocalDateTime和ZoneId的组合。ZoneOffset是一条重要但次要的信息,用于确保类代表一个瞬间,特别是在夏令时重叠期间 例如: ZoneId

我喜欢字符串类型:
“2015-01-05 17:00”
ZoneId
“澳大利亚/悉尼”

如何使用Java 8 datetime API将此时间信息转换为相应的UTC时间


还需要考虑DST的内容。

您正在寻找Java8中的
ZoneDateTime
类-一个完整的日期时间,带有时区,并解决了UTC/格林威治的偏移。就设计而言,该类主要应被视为
LocalDateTime
ZoneId
的组合。
ZoneOffset
是一条重要但次要的信息,用于确保类代表一个瞬间,特别是在夏令时重叠期间

例如:

ZoneId australia = ZoneId.of("Australia/Sydney");
String str = "2015-01-05 17:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter);
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia );

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney);

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC);

System.out.println("Current date and time in UTC : " + utcDate);

现有答案的另一种选择是使用适当的时区设置格式化程序:

String input = "2015-01-05 17:00";
ZoneId zone = ZoneId.of("Australia/Sydney");

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone);
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC);
由于您希望与数据库交互,因此可能需要
java.sql.Timestamp
,在这种情况下,您不需要显式转换为UTC时间,但可以使用即时时间:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt);
Timestamp sqlTs = Timestamp.from(zdt.toInstant());

看来这个结果不是我想要的。我想转换为UTC时间并将UTC时间存储在我的数据库中。ZonedDateTime不是我想要的,无法映射到DB列类型。很抱歉,我在示例中添加了UTC转换。很酷,似乎我们必须将LocalDateTime转换为ZonedDateTime,然后才能在不同的时区之间转换。谢谢。@MateuszSroka-我的时间戳是零毫秒'2021-04-11 10:25:33.000'。此代码截断零。如何也显示零?我在这里贴了一个相关的问题,你说的“UTC时间”是什么意思?你想喝一杯吗?还是java.sql.Date?或者是从新纪元开始的毫秒数?在这个上下文中UTC变量是什么?它是UTC时区中的日期/时间,与悉尼的“输入”对应。所以在这种情况下,是同一天,但在早上6点。
   **// Refactored Logic**     

        ZoneId australia = ZoneId.of("Australia/Sydney");
        ZoneId utcZoneID= ZoneId.of("Etc/UTC");
        String ausTime = "2015-01-05 17:00";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

        //converting in datetime of java8
        LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter);

        // DateTime With Zone
        ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID);
        // output - 2015-01-05T17:00Z[Etc/UTC]

        // With Formating DateTime
        String utcDateTime = utcDateAndTime.format(formatter);
        // output - 2015-01-05 17:00