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

新手上路,请多包涵

我有一段时间使用字符串类型,例如: "2015-01-05 17:00"ZoneId"Australia/Sydney"

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

还需要考虑 DST 的东西。

原文由 ttt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 842
2 个回答

您正在寻找 ZonedDateTime 中的类 - 带有时区的完整日期时间和从 UTC/Greenwich 解析的偏移量。在设计方面,此类应主要视为 LocalDateTimeZoneId 的组合。 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);

原文由 Mateusz Sroka 发布,翻译遵循 CC BY-SA 3.0 许可协议

现有答案的替代方法是使用适当的时区设置格式化程序:

 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());

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题