1. Вступ до Date Time API

Розробникам Java не дуже подобалася поточна ситуація з класами Date і Calendar. Вони були хороші свого часу, але часи змінюються. І потрібно було щось просте, потужне та надійне. І ось разом з випуском Java8 (15 років потому після виходу Calendar) було представлено Java Date Time API: набір класів, які повинні вирішити всі можливі проблеми з часом.
Класів було так багато, що їх вирішили рознести по декількох пакетах:
Пакет java.time — базовий пакет для Java Date Time API: в ньому містяться такі класи як LocalDate, LocalTime, LocalDateTime, Instant, Period, Duration. Усі об'єкти цих класів — immutable: їх не можна змінити після створення.
Пакет java.time.format містить у собі класи для форматування часу: перетворення часу (і дати) у текстовий рядок і назад. Наприклад, у ньому міститься такий універсальний клас як DateTimeFormatter, який прийшов на зміну SimpleDateFormat.
Пакет java.time.zone містить класи для роботи з часовими поясами (time zones). Він містить такі класи як TimeZone і ZonedDateTime. Якщо ви пишете код для сервера, клієнти якого знаходяться в різних частинах світу, ці класи вам дуже знадобляться.
2. Клас LocalDate
Перший і найкорисніший клас із Date Time API, який ми вивчимо — це клас LocalDate. Як ви, скоріш за все, здогадуєтеся з його назви, цей клас створений для роботи з датою.
Об'єкти цього класу не змінюються після створення (клас LocalDate immutable). Проте це додало класу простоти та надійності. Особливо якщо з об'єктом класу одночасно взаємодіє декілька потоків (threads).
Щоб створити новий об'єкт класу LocalDate, потрібно скористатися одним із статичних методів. Ось список основних.
Отримання поточної дати
Щоб отримати поточну дату, потрібно скористатися статичним методом now(). Це набагато простіше, ніж здається:
LocalDate today = LocalDate.now();
Де today — це змінна класу LocalDate, а LocalDate.now() — виклик статичного методу now() у класу LocalDate.
Приклад:
| Код | Вивід |
|---|---|
|
|
Отримання дати у певному часовому поясі
Також у класу LocalDate є варіант методу now(ZoneId), який дозволяє отримати поточну дату у певному часовому поясі.
Для цього нам знадобиться ще один клас — ZoneId (java.time.ZoneId). У нього є метод of(), який повертає об'єкт ZoneId за ім'ям часового поясу.
Щоб визначити поточну дату в Шанхаї, потрібно написати код:
| Код | Вивід |
|---|---|
|
|
Список імен усіх часових поясів (time zone) можна знайти в інтернеті.
3. Отримання конкретної дати
Щоб отримати об'єкт LocalDate, який містить певну дату, потрібно скористатися статичним методом of(). Виглядає все теж дуже просто і зрозуміло:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Де date — це змінна класу LocalDate, а LocalDate.of() — виклик статичного методу of() у класу LocalDate.
Також тут ми бачимо використання спеціальної константи FEBRUARY класу Month (java.time.Month) для завдання місяця Лютий.
Можна вказати місяць і по-старому — за допомогою числа:
LocalDate date = LocalDate.of(2019, 2, 22);
Двійка? Замість місяця Лютий? Це що, місяці тепер знову нумеруються з одиниці?
Так, нарешті через майже 20 років після створення Java місяці перестали нумерувати з нуля.
Приклад:
| Код | Вивід |
|---|---|
|
|
Отримання дати по номеру дня
Є ще один цікавий метод створення дати: за допомогою методу ofYearDay можна отримати дату, маючи лише номер року та номер дня року. Загальний вигляд такий:
LocalDate date = LocalDate.ofYearDay(рік, день);
Де рік — це номер року, а день — номер дня в році.
Приклад:
| Код | Вивід |
|---|---|
|
|
Сотий день у 2019 році — це 10 квітня.
Отримання дати Unix
Пам'ятаєте, що об'єкти класу Date завжди зберігали час у мілісекундах з 1 січня 1970 року? Щоб програмісти не сумували за старими добрими часами, у клас LocalDate додали метод ofEpochDay(), який повертає дату, відраховану від 1 січня 1970 року. Загальний вигляд такий:
LocalDate date = LocalDate.ofEpochDay(день);
Де день — це кількість днів, що минуло від 1 січня 1970 року.
Приклад:
| Код | Вивід |
|---|---|
|
|
4. Отримання фрагментів дати
Змінювати об'єкти класу LocalDate не можна, а от отримувати окремі фрагменти дати ще й як можна. Для цього у об'єктів класу LocalDate є кілька методів:
| Метод | Опис |
|---|---|
|
Повертає рік із конкретної дати |
|
Повертає місяць дати — одну з спеціальних константJANUARY, FEBRUARY, ...; |
|
Повертає номер місяця з дати. Січень == 1. |
|
Повертає номер дня в місяці |
|
Повертає номер дня з початку року |
|
Повертає день тижня: одну з спеціальних константMONDAY, TUESDAY, ...; |
|
Повертає еру: константа BC (Before Current Era) і CE(Current Era) |
Приклад:
| Код | Вивід |
|---|---|
|
|
5. Зміна дати в об'єкті LocalDate
Клас LocalDate містить кілька методів, які дозволяють працювати з датою. Ці методи реалізовані за аналогією з методами класу String: кожен із цих методів не змінює існуючий об'єкт LocalDate, а повертає новий з потрібними даними.
Ось які методи є у класу LocalDate:
| Метод | Опис |
|---|---|
|
Додає певну кількість днів до дати |
|
Додає тижні до дати |
|
Додає місяці до дати |
|
Додає роки до дати |
|
Віднімає дні від дати |
|
Віднімає тижні від дати |
|
Віднімає місяці від дати |
|
Віднімає роки від дати |
Приклад:
| Код | Вивід |
|---|---|
|
|
Об'єкт birthday, чиї методи ми викликаємо, не змінюється. Замість цього його методи повертають нові об'єкти, які і містять потрібні дані.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ