Несколько 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. Рекомендации
- Переход на летнее и зимнее время
- Явадок времени зонирования
- Часовой пояс в Париже
- Java – Преобразование даты и времени между часовыми поясами
- Java 8 – Преобразование мгновенного времени в ZonedDateTime
- Java 8 – Как преобразовать строку в LocalDate
- Как сравнить даты в Java
Оригинал: “https://mkyong.com/java8/java-8-zoneddatetime-examples/”