Java 8 New Date/Time API - Часть 5
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8.
1. Введение
В предыдущей статье мы научились форматировать дату и время в Java 8. В этой статье мы рассмотрим работу даты и времени с временными зонами.
2. Базовая работа с ZonedDateTime
Создать ZonedDateTime можно так же как и LocalDateTime.
1 2 3 4 5 6 |
ZonedDateTime now = ZonedDateTime.now(); // 2018-02-10T08:49:50.886682+01:00[Europe/Warsaw] LocalDate localDate = LocalDate.of(2018, 1, 1); LocalTime localTime = LocalTime.of(10, 30); ZoneId zone = ZoneId.of("Europe/Kiev"); ZonedDateTime kievTime = ZonedDateTime.of(localDate, localTime, zone); // 2018-01-01T10:30+02:00[Europe/Kiev] |
да и вообще ZonedDateTime просто напросто содержит внутри себя LocalDateTime и ZoneId. Так что вы уже умеете добавлять, отнимать дату и время, офа так же форматировать и сравнивать ZonedDateTime.
3. Конвертация ZonedDateTime между зонами
Конвертация между временными зонами происходит с помощью метода withZoneSameInstant()
1 2 3 4 5 6 7 |
LocalDate localDate = LocalDate.of(2018, 1, 1); LocalTime localTime = LocalTime.of(10, 30); ZoneId zone = ZoneId.of("Europe/Kiev"); ZonedDateTime kievTime = ZonedDateTime.of(localDate, localTime, zone); // 2018-01-01T10:30+02:00[Europe/Kiev] ZonedDateTime nyTime = kievTime.withZoneSameInstant(ZoneId.of("America/New_York")); // 2018-01-01T03:30-05:00[America/New_York] ZonedDateTime japanTime = kievTime.withZoneSameInstant(ZoneOffset.of("-09:00")); // 2017-12-31T23:30-09:00 |
Временную зону можно указывать либо с помощью ZoneId либо с помощью ZoneOffset в случае, если вы не знаете id города/страны.
4. Как получить все временные зоны
Вот так
1 2 |
List<String> zones = new ArrayList<>(ZoneId.getAvailableZoneIds()); zones.forEach(System.out::println); |
Данный код выведет все id временных зон, но без указания смещения (offset). Для вывода временных зон со смещением можно использовать следующий код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Example { private static final LocalDateTime LDT = LocalDateTime.now(); public static void main(String[] args) { List<String> zones = new ArrayList<>(ZoneId.getAvailableZoneIds()); Map<String, String> map = zones.stream() .collect(Collectors.toMap(zone -> zone, Example::getOffset)); TreeMap<String, String> sortedMap = new TreeMap<>(map); sortedMap.forEach((zone, offset) -> System.out.printf("%s (UTC%s) \n", zone, offset)); } private static String getOffset(String zone) { ZonedDateTime zdt = LDT.atZone(ZoneId.of(zone)); return zdt.getOffset().getId().replace("Z", "+00:00"); } } |
что именно выводит этот код посмотрите сами + еще раз есть возможность поработать со Stream API. А в следующей статье мы рассмотрим такие классы как Duration и Period . Спасибо, что были с нами 🙂