1. Перехід від класу Date до класу Calendar

Програмісти любили клас Date за його простоту й за підтримку стандартів Unix, але, як відомо, наші недоліки — це продовження наших чеснот.
Програмісти хотіли мати «розумний клас Date». І такий клас з'явився — ним став клас Calendar. Його задумували як інструмент не лише для зберігання дат, а й для складної роботи з ними.
Повне ім'я класу Calendar — java.util.Calendar. Не забувайте додавати його в import, якщо вирішите використовувати у своєму коді.
Створити об'єкт Calendar можна за допомогою команди:
Calendar date = Calendar.getInstance();
Статичний метод getInstance() класу Calendar створить об'єкт Calendar, ініціалізований поточною датою. Залежно від налаштувань комп'ютера, на якому виконується програма, буде створено потрібний календар.
Правильніше було б сказати «актуальний». Річ у тім, що на Землі не один календар, а багато. І майже кожен із них пов'язаний з якоюсь релігією або країною. Клас Calendar підтримує три календарі:
| Календар | Опис |
|---|---|
| GregorianCalendar | Християнський григоріанський календар |
| BuddhistCalendar | Буддистський календар |
| JapaneseImperialCalendar | Японський імператорський календар |
А ще ж є китайський та арабський календарі. Загалом, працювати з часом не так просто, як здається.
У Китаї на момент написання цієї лекції офіційно 4716 рік. А за мусульманським календарем — 1398. Ласкаво просимо у великий світ, друже-програмісте!
2. Створення об'єкта-календаря
Ми будемо використовувати григоріанський календар, як найпоширеніший у світі. Принаймні доти, доки Китай не купить компанію Oracle і не зробить свій календар основним.
Об'єкт-календар із довільною датою створюють за допомогою команди
Calendar date = new GregorianCalendar(рік, місяць, день);
Так, щоразу доведеться писати GregorianCalendar. Можна і замість Calendar писати GregorianCalendar: так теж працюватиме. Просто Calendar писати швидше.
Рік потрібно писати повністю: ніяких 19 замість 2019. Місяці, як і раніше, нумеруються з нуля. А дні місяця, як і раніше, нумеруються не з нуля (слабаки!).
Щоб задати не тільки дату, а й час, слід передати його як додаткові параметри:
… = new GregorianCalendar(рік, місяць, день, години, хвилини, секунди);
Можна передати навіть мілісекунди, якщо є потреба: їх указують як наступний параметр після секунд.
3. Виведення об'єкта-календаря на екран
Якщо просто вивести об'єкт-календар на екран, результат вас не дуже порадує.
| Код |
|---|
|
| Виведення на екран |
|
Уся річ у тім, що календар — це саме календар, а не дата: у нього багато різних параметрів, і всі вони виводяться на екран.
Правильно буде відображати об'єкт календар за допомогою класу SimpleDateFormat, але поки ми його не вивчили, можна скористатися лайфхаком.
Date date = calendar.getTime();
Просто об'єкт типу Calendar можна легко перетворити на об'єкт типу Date, а як виводити на екран об'єкт типу Date, ви вже знаєте. Приблизно так можна перетворити об'єкт Calendar на Date:
Використання методу getTime():
| Код | Виведення на екран |
|---|---|
|
|
Зовсім інша справа, чи не так?
4. Робота з фрагментами дати
Для отримання фрагменту дати (рік, місяць, …) клас Calendar має спеціальний метод — get(). Метод один, зате з параметрами:
int month = calendar.get(Calendar.MONTH);
де calendar — це змінна типу Calendar, а MONTH — це змінна-константа класу Calendar.
У метод get ви передаєте як параметр спеціальну константу класу Calendar і в результаті отримуєте потрібне значення.
Приклади
| Код | Опис |
|---|---|
|
ера (до нашої ери чи після) рік місяць день місяця день тижня години хвилини секунди |
Для змінення фрагмента дати використовується метод set:
calendar.set(Calendar.MONTH, значення);
де calendar — це змінна типу Calendar, а MONTH — це змінна-константа класу Calendar.
У метод set ви передаєте як перший параметр спеціальну константу класу Calendar, а як другий параметр — нове значення.
Приклади
| Код | Опис |
|---|---|
|
рік = 2019 місяць = липень (нумерація з 0) 4 число години хвилини секунди |
5. Константи класу Calendar
У класі Calendar є константи не лише для назв фрагментів дати, а й, мабуть, на всі випадки життя.
Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);
Наприклад, є константи для позначення місяців:
Або, приміром, для днів тижня:
Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
System.out.println("Це п'ятниця");
}
Усе перелічувати не будемо. Просто не дивуйтеся, якщо побачите такі записи в коді.
Використання констант дає змогу зробити код читабельнішим, тому програмісти їх і додали. Ну а місяці нумеруються з нуля теж заради легкочитності. Або ні.
6. Змінення дати в об'єкті Calendar
Клас Calendar має метод, який дає змогу виконувати з датою розумніші операції, як-от додати до неї рік, місяць або кілька днів. Або відняти. Цей метод називається add(). Працювати з ним можна приблизно так:
calendar.add(Calendar.MONTH, значення);
де calendar — це змінна типу Calendar, а MONTH — це змінна-константа класу Calendar.
У метод add ви передаєте як перший параметр спеціальну константу класу Calendar, а як другий параметр — значення, яке треба додати.
Особливість цього методу в тому, що він розумний. Подивіться самі наскільки:
| Код |
|---|
|
| Виведення на екран |
|
Цей метод розуміє, що в лютому 2019 року лише 28 днів і підсумкова дата — 1 березня.
А тепер віднімемо 2 місяці! Що має вийти? 27 грудня 2018 року! Зараз перевіримо.
Щоб виконати дію, яка зменшує дату, потрібно в метод add() передати значення зі знаком «−»:
| Код |
|---|
|
| Виведення на екран |
|
Працює!
Цей метод ураховує кількість днів у місяцях і високосні роки. Тобто метод чудовий. Саме те, що потрібно більшості програмістів, які багато працюють із датами.
7. Прокручування фрагментів дати
Однак іноді трапляються ситуації, коли така розумна поведінка зайва: хочеться щось зробити з однією частиною дати, не змінюючи все інше.
Для цього клас Calendar має спеціальний метод — roll(). За своєю сигнатурою він повністю аналогічний методу add(), але будь-які зміни з його допомогою стосуються одного параметра, решта залишаються незмінними.
Приклад:
| Код |
|---|
|
| Виведення на екран |
|
Місяць ми змінили, а рік і число залишилися без змін.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ