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

我有时间用字符串类型: "2015-01-05 17:00"ZoneId"Australia/Sydney"

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

还需要考虑DST的东西。

您正在寻找ZonedDateTime类 – 一个完整的日期时间,具有时区和已解析的UTC / Greenwich偏移量。 在设计方面,该类应主要视为LocalDateTimeZoneId的组合。 ZoneOffset是一条重要但次要的信息,用于确保class级代表瞬间,特别是在夏令时重叠期间。

例如:

 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时间,但可以使用Instant:

 ZonedDateTime zdt = ZonedDateTime.parse(input, fmt); Timestamp sqlTs = Timestamp.from(zdt.toInstant()); 
  **// 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