1. Клас Date і Unix-час
З самого появи мови Java в ній був спеціальний клас для роботи з часом і датою — Date. З часом з'явилося ще кілька класів для роботи з датою, але клас Date досі використовується програмістами.
Уся справа в тому, що він дуже простий і зручний. І ти як програміст обов'язково зіткнешся з ним у будь-якому реальному проєкті. Використовувати його чи ні — вибір за тобою, але знати його ти зобов'язаний. Тому приділи йому кілька хвилин свого дорогоцінного часу.
Чим же такий гарний клас Date? Своєю простотою.
Клас Date зберігає інформацію про дату і час у вигляді кількості мілісекунд, що пройшли з 1 січня 1970 року. Це дуже багато мілісекунд, тому для їх зберігання використовується тип long.
Чому саме з 1970 року? Це так званий Unix-time: саме так зберігає час операційна система Unix, яка є бабусею всіх сучасних операційних систем.
А ще можна дуже легко дізнатися, скільки часу пройшло між двома датами: достатньо відняти одну дату від іншої, і отримаєш різницю в часі між датами з точністю до мілісекунд.
Ось кілька корисних прикладів роботи з класом Date.
2. Отримання поточної дати
Щоб отримати поточний час і дату, достатньо просто створити об'єкт типу Date. Кожен новий об'єкт зберігає час (момент) його створення. Виглядає це дуже просто:
Date current = new Date();
Після виконання цієї команди змінна current буде зберігати посилання на створений об'єкт Date, який всередині себе буде зберігати час його створення — кількість мілісекунд, що минули з 1 січня 1970 року.
Вивід поточної дати на екран
Щоб вивести на екран поточну дату, просто: а) створіть новий об'єкт Date, б) виведіть його на екран за допомогою методу System.out.println().
Приклад:
| Код | Вивід на екран |
|---|---|
|
|
Вивід на екран розшифровується так:
| Текст | Розшифровка |
|---|---|
| Thursday | Четвер |
| February 21 | 21 Лютого |
| 14:01:34 | години : хвилини : секунди |
| EET | Часовий пояс: East European Time (східноєвропейський час) |
| 2019 | Рік |
3. Завдання певної дати
Як отримати поточний час, ми розібралися, а як створити об'єкт Date, який би містив іншу дату або час?
Тут теж усе просто. Щоб задати певний день, потрібно написати код такого виду:
Date birthday = new Date(рік, місяць, день);
Усе просто й очевидно, але є два нюанси:
- Рік потрібно задавати від 1900.
- Місяці нумеруються з нуля.
Це теж спадщина операційної системи Unix: там програмісти позначали рік двома цифрами. Замість 1977 писали просто 77. Тому 77 стане правильним роком, якщо ми рахуємо від 1900 року.
Наприклад, я народився 21 березня 1989 року. Березень — третій місяць, значить мені потрібно написати
| Код | Вивід на екран |
|---|---|
|
|
Місяці нумеруються з нуля, а дні — ні. Трішки дивно, так?
Гадаємо, справжні програмісти мали б пересилити себе і дні місяця теж нумерувати з нуля. Ох ці конформісти 🙂
Завдання певного часу
Задати певний час теж досить просто: для цього потрібно написати команду такого виду:
Date birthday = new Date(рік, місяць, день, години, хвилини, секунди);
Години, хвилини і секунди нумеруються з нуля: програміст у вас повинен зітхнути спокійно.
Приклад:
| Код | Вивід на екран |
|---|---|
|
|
Ми задали час 12:15 і дату 4 червня 2005 року. Читається трохи складнувато для непрофесіонала, зате працює як треба.
4. Робота з фрагментами дати
Об’єкт Date можна не просто виводити на екран. У нього є методи, які дозволяють отримати окремі фрагменти його дати:
| Метод | Опис |
|---|---|
|
Повертає рік дати відносно 1900 року. |
|
Повертає місяць дати, місяці нумеруються з нуля |
|
Повертає день місяця |
|
Повертає день тижня |
|
Повертає години |
|
Повертає хвилини |
|
Повертає секунди |
Приклад:
| Код | Вивід на екран | Примітка |
|---|---|---|
|
|
2005 рік червень день місяця субота |
До речі, у об'єкта Date окремі фрагменти дати можна не тільки отримувати, але й змінювати:
| Метод | Опис |
|---|---|
void setYear(int year) |
Змінює рік дати. Рік задається відносно 1900 року. |
void setMonth(int month) |
Змінює місяць дати, місяці нумеруються з нуля |
void setDate(int date) |
Змінює день місяця |
void setHours(int hours) |
Змінює години |
void setMinutes(int minutes) |
Змінює хвилини |
void setSeconds(int seconds) |
Змінює секунди |
5. Мілісекунди
Як ми вже говорили, всередині об'єкта Date зберігається кількість мілісекунд, що пройшли з 1 січня 1970 року.
Якщо вони нам потрібні, ми можемо отримати їх у об'єкта Date:
long time = date.getTime();
Метод getTime() повертає кількість мілісекунд, яке зберігається всередині об'єкта Date.
Ви можете не просто отримати кількість мілісекунд, але й змінити їх у існуючому об'єкті:
Date date = new Date();
date.setTime(1117876500000L);
До речі, можна записати цю конструкцію коротше, передавши час в об'єкт Date прямо під час його створення:
Date date = new Date(1117876500000L);
6. Порівняння дат
Якщо ти хочеш порівняти дві дати і дізнатися, яка з них була раніше, для цього є три способи
Спосіб перший — просто порівняти кількість мілісекунд, яке в них зберігається:
if (date1.getTime() < date2.getTime())
Спосіб другий — використовувати метод before() об'єкта Date:
if (date1.before(date2))
Читається це так: якщо date1 перед date2, то...
Спосіб третій — використовувати метод after() об'єкта Date:
if (date2.after(date1))
Читається це так: якщо date2 після date1, то...
7. Клас DateFormat
Пам’ятаєш, коли ми виводили дату на екран, відображалося щось типу Thu Feb 21 14:01:34 EET 2019. Наче все правильно, але це скоріше відображення дати для програміста. А для користувача хотілося б відображати дату зрозуміліше. Щось на кшталт Вівторок, 21 Лютого.
І без року. Ну або з роком, якщо треба. Загалом, хотілося б відображати дату різними способами.
Для цього є спеціальний клас — SimpleDateFormat.
Приклад:
| Код |
|---|
|
| Вивід на екран |
|
Бачиш, що програма вивела на екран: Jun-04-2005. Це зовсім не те, що було раніше.
А вся справа у тому, що ми відображали не сам об'єкт Date, а спеціальний рядок, отриманий викликом методу format() у об'єкта типу SimpleDateFormat. Але ключове тут навіть не це.
Коли об’єкт SimpleDateFormat створюється, у нього як параметри ми передаємо рядок "MMM-dd-YYYY". Ось в цьому рядку і зашифровано формат дати, який ти побачив у результаті на екрані.
- MMM означає вивести назву місяця, скорочену до трьох літер
- dd — вивести день місяця
- YYYY — вивести рік, що складається з чотирьох цифр
Якщо ми хочемо вивести місяць у вигляді цифр, потрібно замість MMM написати MM: отримаємо рядок "MM-dd-YYYY". На екран буде виведено 06-04-2005
Більш детально ми розберемо цей клас пізніше.
8. Метод Date.parse
Клас Date вміє робити ще одну цікаву і корисну штуку: отримувати дату з текстового рядка. Або як кажуть програмісти, парсити рядок.
Для цього в нього є спеціальний метод — parse(). Процес парсингу виглядає ось так:
Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );
До речі, цей же код можна записати більш компактно:
Date date = new Date("Jul 06 12:15:00 2019");
Детальніше парсинг рядків ми розберемо в інших лекціях.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ