Java 8 将给定的时间和时区转换为UTC时间
Java 8 Convert given time and time zone to UTC time
我有一段时间使用字符串类型,例如:"2015-01-05 17:00"
和 ZoneId
是 "Australia/Sydney"
。
如何使用 Java 8 datetime API 将此时间信息转换为对应的 UTC 时间?
还需要考虑 DST 的东西。
您正在 Java8 中寻找 ZonedDateTime
class - 一个完整的 date-time 与 time-zone 和从 UTC/Greenwich 的解析偏移量。在设计上,这个 class 应该主要被看作是 LocalDateTime
和 ZoneId
的组合。 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
我有一段时间使用字符串类型,例如:"2015-01-05 17:00"
和 ZoneId
是 "Australia/Sydney"
。
如何使用 Java 8 datetime API 将此时间信息转换为对应的 UTC 时间?
还需要考虑 DST 的东西。
您正在 Java8 中寻找 ZonedDateTime
class - 一个完整的 date-time 与 time-zone 和从 UTC/Greenwich 的解析偏移量。在设计上,这个 class 应该主要被看作是 LocalDateTime
和 ZoneId
的组合。 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