我有一个字符串类型就像一个计时:"2015-01-05 17:00"
和ZoneId
是"Australia/Sydney"
.
如何使用Java 8 datetime API将此时间信息转换为对应的UTC时间?
还需要考虑DST的东西.
您正在寻找ZonedDateTime
Java8 中的类 - 一个完整的日期时间,具有时区和已解析的UTC/Greenwich偏移量.在设计方面,这个类应该主要被视为a LocalDateTime
和a 的组合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时间,但可以使用Instant:
ZonedDateTime zdt = ZonedDateTime.parse(input, fmt); Timestamp sqlTs = Timestamp.from(zdt.toInstant());