Java 8 - примеры ZonedDateTime
Несколько примеровjava.time.ZonedDateTime
, чтобы показать вам, как преобразовать часовой пояс между разными странами.
1. Малайзия (KUL) → Япония (HND)
Просмотрите информацию о рейсе из Малайзии Куала-Лумпур (UTC + 08: 00) в Японию Токио Ханеда (UTC + 09: 00)
---Flight Detail--- Kuala Lumpur (KUL) -> Tokyo Haneda (HND) Flight Duration : 7 hours (KUL-Depart) 1430, 22 Aug 2016 -> 2230, 22 Aug 2016 (HND-Arrive)
P.S Japan Tokyo is one hour faster than Malaysia Kuala lumpur
DifferentTimeZoneExample1.java
package com.example.timezone; import java.time.LocalDateTime; import java.time.Month; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DifferentTimeZoneExample1 { public static void main(String[] args) { DateTimeFormatter format = DateTimeFormatter.ofPattern("HHmm, dd MMM yyyy"); 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]
2. Франция, Париж → -05: 00
Другой пример часового пояса из Франции, Парижа (UTC + 02: 00, летнее время) в жестко закодированный (UTC-05: 00) часовой пояс (например, Нью-Йорк)
---Flight Detail--- France, Paris -> UTC-05:00 Flight Duration : 8 hours 10 minutes (Depart) 1430, 22 Aug 2016 -> 1540, 22 Aug 2016 (Arrive)
DifferentTimeZoneExample2.java
package com.example.timezone; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DifferentTimeZoneExample2 { public static void main(String[] args) { DateTimeFormatter format = DateTimeFormatter.ofPattern("HHmm, dd MMM yyyy"); //Convert String to LocalDateTime String date = "2016-08-22 14:30"; LocalDateTime ldt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-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
Daylight Saving Time (DST)
Париж, обычно UTC + 1 имеет летнее время (добавить один час = UTC + 2) с 27 марта по 30 октября 2016 года. Просмотрите вышеприведенный вывод,java.time
может правильно рассчитать и обработать DST.