it-swarm.com.ru

Java 8 Преобразование заданного времени и часового пояса в время UTC

У меня есть время со строковым типом, таким как: "2015-01-05 17:00" и ZoneId is "Australia/Sydney".

Как я могу преобразовать эту информацию времени в соответствующее время UTC, используя Java 8 datetime API?

Также необходимо учитывать DST вещи.

28
ttt

Вы ищете класс ZonedDateTime в Java8 - полную дату-время с часовым поясом и разрешенным смещением от UTC/Гринвич. С точки зрения дизайна, этот класс следует рассматривать в первую очередь как комбинацию LocalDateTime и 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);
48
Mateusz Sroka

Альтернативой существующему ответу является настройка форматера с соответствующим часовым поясом:

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());
15
assylias
   **// 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
0
Mukesh