1. Клас ZonedDateTime
Є ще один дуже цікавий клас в Date Time API — клас ZonedDateTime. Основне його призначення — зручно працювати з датами в різних часових поясах.
LocalDate ідеально підходить для опису дат. Наприклад, дня народження: у мене день народження 15 березня незалежно від того, де я знаходжусь. Це приклад дати.
LocalTime ідеально підходить для опису часу, наприклад, будильника: я завів будильник на 5 ранку і байдуже, де я знаходжусь. 5 ранку — це 5 ранку. Це приклад роботи з часом.
А тепер припустимо, що ми пишемо застосунок, який бронює авіаквитки. Літаки злітають і приземляються за місцевим часом, літак летить фіксований час, але часові пояси змінюються.
Часові зони
До речі, з часовими зонами у світі справжній хаос. Більше того, якщо ви думаєте, що часових поясів 24, ви серйозно помиляєтесь.
Наприклад, час в Індії відрізняється від Грінвіча на 5 з половиною годин: GMT+5:30. Одні країни переходять на літній час, інші ні. Причому різні країни переходять на літній час в різний час року.
А деякі країни за допомогою законів скасовують перехід на літній час, або знову вводять, або знову скасовують.
Загалом, у світі є часові зони, всередині кожної зони один і той самий час. Час в різних зонах може збігатись в певні періоди року, а в інші періоди відрізнятись. Зони зазвичай називають за великими містами, що знаходяться в них: Europe/Monaco, Asia/Singapore, хоча бувають і винятки — US/Pacific.
Загалом на даний момент офіційно відомо 599 часових зон. Уявіть собі: 599. Це зовсім не 24. Ласкаво просимо до глобального світу.
Для зберігання часової зони в Java використовується клас ZoneId з пакету java.time.
До речі, у нього є статичний метод getAvailableZoneIds(), який повертає множину всіх відомих на поточний момент часових зон. Щоб отримати список всіх зон, потрібно написати такий код:
| Код | Вивід на екран (частина) |
|---|---|
|
|
Щоб отримати об'єкт ZoneId за його ім’ям, потрібно скористатися статичним методом of();
| Код | Примітка |
|---|---|
|
|
2. Створення об'єкта ZonedDateTime
При створенні об'єкта ZonedDateTime потрібно викликати у нього статичний метод now() і передати до нього об'єкт ZoneId.
| Код | Вивід на екран |
|---|---|
|
|
Якщо до методу now() не передати об'єкт ZoneId, а так можна, часова зона буде визначена автоматично: на основі налаштувань комп'ютера, на якому виконується програма.
Приклад:
| Код | Вивід на екран |
|---|---|
|
|
Перетворення глобальної дати в локальну
Однією з цікавих особливостей ZonedDateTime є можливість його перетворення в локальну дату і час. Приклад:
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);
LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();
3. Робота з часом
Як і у класу LocalDateTime, у класу ZonedDateTime є багато способів отримати окремі фрагменти дати і часу. Ось список цих методів:
|
Повертає рік з конкретної дати |
|
Повертає місяць дати: одну зі спеціальних констант JANUARY, FEBRUARY, ...; |
|
Повертає номер місяця з дати. Січень == 1 |
|
Повертає номер дня в місяці |
|
Повертає день тижня: одну зі спеціальних констант MONDAY, TUESDAY, ...; |
|
Повертає номер дня в році |
|
Повертає години |
|
Повертає хвилини |
|
Повертає секунди |
|
Повертає наносекунди |
Усі методи повністю аналогічні методам LocalDateTime. І, звісно, у класу ZonedDateTime є методи, які дозволяють працювати з датою та часом. При цьому об'єкт, у якого викликаються методи, не змінюється: замість цього методи повертають новий об'єкт ZonedDateTime:
| Методи | Опис |
|---|---|
|
Додає роки до дати |
|
Додає місяці до дати |
|
Додає дні до дати |
|
Додає години |
|
Додає хвилини |
|
Додає секунди |
|
Додає наносекунди |
|
Віднімає роки від дати |
|
Віднімає місяці від дати |
|
Віднімає дні від дати |
|
Віднімає години |
|
Віднімає хвилини |
|
Віднімає секунди |
|
Віднімає наносекунди |
Приклади наводити не будемо: думаємо, тут і так все зрозуміло за аналогією з тільки що розглянутими класами.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ