Рубрики
Без рубрики

Примеры Java 8–ZonedDateTime

Преобразование часовых поясов с использованием Java 8 ZonedDateTime.

Несколько Java 8 java.время. ZonedDateTime примеры, показывающие, как конвертировать часовой пояс между разными странами.

Содержание

  • 1. Преобразование LocalDateTime в ZonedDateTime
  • 2. Малайзия (UTC+08:00) – > Япония (UTC+09:00)
  • 3. Франция, Париж (UTC+02:00, летнее время) -> (UTC-05:00)
  • 4. Рекомендации

1. Преобразование LocalDateTime в ZonedDateTime

LocalDateTime не имеет часового пояса; для преобразования LocalDateTime в ZonedDateTime , мы можем использовать .atZone(ZoneId.системный по умолчанию ()) для создания ZonedDateTime содержит системный часовой пояс по умолчанию и преобразует его в другой часовой пояс, используя предопределенный идентификатор зоны или смещение.

package com.mkyong.app;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class ZonedDateTimeExample1 {

  public static void main(String[] args) {

      LocalDateTime now = LocalDateTime.now();
      System.out.println(now);
      System.out.println("ZoneId.systemDefault(): " + ZoneId.systemDefault());

      // convert LocalDateTime to ZonedDateTime, with default system zone id
      ZonedDateTime zonedDateTime = now.atZone(ZoneId.systemDefault());

      // convert LocalDateTime to ZonedDateTime, with specified zoneId
      ZonedDateTime europeDateTime = zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Kaliningrad"));
      System.out.println(europeDateTime);

      // convert LocalDateTime to ZonedDateTime, with specified off set
      ZonedDateTime offSetNegative5 = now.atOffset(ZoneOffset.of("-05:00")).toZonedDateTime();
      System.out.println(offSetNegative5);

      // display all zone ids
      //ZoneId.getAvailableZoneIds().forEach(System.out::println);

  }

}

Выход

2021-03-23T16:43:32.010069453
ZoneId.systemDefault(): Asia/Kuala_Lumpur
2021-03-23T10:43:32.010069453+02:00[Europe/Kaliningrad]
2021-03-23T16:43:32.010069453-05:00

2. Малайзия (UTC+08:00) – > Япония (UTC+09:00)

Ознакомьтесь с информацией о рейсе из Малайзии Куала-Лумпур (UTC+08:00) в Японию Токио Ханеда (UTC+09:00). Японский Токио на один час быстрее малайзийского Куала-Лумпура.

Kuala Lumpur (KUL) -> Tokyo Haneda (HND)
Flight Duration : 7 hours

(KUL-Depart) 1430, 22 Aug 2016 ->  2230, 22 Aug 2016 (HND-Arrive)

Приведенная ниже программа имитирует вышеуказанную информацию о рейсе, если рейс вылетает из Малайзии 2016-08-22T14:30+08:00 , и он прибудет в Токио около 2016-08-22T22:30+09:00 , 7 продолжительность полета в часах.

package com.mkyong.app;

import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class ZonedDateTimeExample2 {

  public static void main(String[] args) {

      DateTimeFormatter format = DateTimeFormatter.ofPattern("HHmm, dd MMM uuuu");

      LocalDateTime ldt = LocalDateTime.of(2016, Month.AUGUST, 22, 14, 30);
      System.out.println("LocalDateTime : " + format.format(ldt));

      //UTC+8
      ZonedDateTime klDateTime = ldt.atZone(ZoneId.of("Asia/Kuala_Lumpur"));
      System.out.println("Depart : " + format.format(klDateTime));

      //UTC+9 and flight duration = 7 hours
      ZonedDateTime japanDateTime = klDateTime.withZoneSameInstant(ZoneId.of("Asia/Tokyo")).plusHours(7);
      System.out.println("Arrive : " + format.format(japanDateTime));

      System.out.println("\n---Detail---");
      System.out.println("Depart : " + klDateTime);
      System.out.println("Arrive : " + japanDateTime);

  }
}

Выход

LocalDateTime : 1430, 22 Aug 2016
Depart : 1430, 22 Aug 2016
Arrive : 2230, 22 Aug 2016

---Detail---
Depart : 2016-08-22T14:30+08:00[Asia/Kuala_Lumpur]
Arrive : 2016-08-22T22:30+09:00[Asia/Tokyo]

3. Франция, Париж (UTC+02:00, летнее время) -> (UTC-05:00)

На этот раз рейс из Франции, Париж (UTC+02:00, летнее время) в жестко заданный Смещение зоны (UTC-05:00) часовой пояс (например, Нью-Йорк).

France, Paris (FR) -> UTC-05:00
Flight Duration : 8 hours 10 minutes

(FR-Depart) 1430, 22 Aug 2016 ->  2230, 22 Aug 2016
package com.mkyong.app;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class ZonedDateTimeExample3 {

  public static void main(String[] args) {

      DateTimeFormatter format = DateTimeFormatter.ofPattern("HHmm, dd MMM uuuu");

      //Convert String to LocalDateTime
      String date = "2016-08-22 14:30";
      LocalDateTime ldt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm"));
      System.out.println("LocalDateTime : " + format.format(ldt));

      //Paris, 2016 Apr-Oct = DST, UTC+2, other months UTC+1
      //UTC+2
      ZonedDateTime parisDateTime = ldt.atZone(ZoneId.of("Europe/Paris"));
      System.out.println("Depart : " + format.format(parisDateTime));

      //hard code a zoneoffset like this, UTC-5
      ZoneOffset nyOffSet = ZoneOffset.of("-05:00");
      ZonedDateTime nyDateTime = parisDateTime.withZoneSameInstant(nyOffSet).plusHours(8).plusMinutes(10);
      System.out.println("Arrive : " + format.format(nyDateTime));

      System.out.println("\n---Detail---");
      System.out.println("Depart : " + parisDateTime);
      System.out.println("Arrive : " + nyDateTime);
  }
}

Выход

LocalDateTime : 1430, 22 Aug 2016
Depart : 1430, 22 Aug 2016
Arrive : 1540, 22 Aug 2016

---Detail---
Depart : 2016-08-22T14:30+02:00[Europe/Paris]
Arrive : 2016-08-22T15:40-05:00

Переход на летнее и зимнее время (DST) Париж, обычно UTC+1, имеет летнее время (добавьте один+2) с 27 марта по 30 октября 2016 года. Просмотрите приведенные выше выходные данные и java.time. * API-интерфейсы могут правильно вычислять и обрабатывать летнее время.

4. Рекомендации

Оригинал: “https://mkyong.com/java8/java-8-zoneddatetime-examples/”