Java 8 Преобразование заданного времени и часового пояса в UTC
У меня есть время со строковым типом вроде: "2015-01-05 17:00"
и ZoneId
is "Australia/Sydney"
.
Как я могу преобразовать эту информацию времени в соответствие времени UTC с использованием API-интерфейса Java 8 datetime?
Также необходимо рассмотреть материал DST.
Ответы
Ответ 1
Вы ищете класс 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);
Ответ 2
Альтернативой существующему ответу является установка форматирования с соответствующим часовым поясом:
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());
Ответ 3
**// 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