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().

Приклад:

Код Виведення на екран
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Виведення на екран розшифровується так:

Текст Розшифровка
Thursday Четвер
February 21 21 лютого
14:01:34 години : хвилини : секунди
EET Часовий пояс: East European Time (східноєвропейський час)
2019 Рік

3. Задання певної дати

Як отримати поточний час, ми розібралися, а як створити об'єкт Date, який би містив іншу дату або час?

Тут теж усе просто. Щоб задати певний день, слід написати такий код:

Date birthday = new Date(рік, місяць, день);

Усе просто й очевидно, але є два нюанси:

  1. Рік потрібно задавати від 1900.
  2. Місяці нумеруються з нуля.
Цікаво

Це теж спадок від операційної системи Unix: там програмісти позначали рік двома цифрами. Замість 1977 писали просто 77. Тому 77 буде правильним роком, якщо ми ведемо відлік від 1900 року.

Приміром, я народився 21 березня 1989 року. Березень — третій місяць, значить, мені потрібно написати

Код Виведення на екран
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Місяці нумеруються з нуля, а дні — ні. Трохи дивно, еге ж?

Вважаємо, справжні програмісти мусили пересилити себе і дні місяця теж нумерувати з нуля. Ох уже ці конформісти! 🙂

Задання певного часу

Задати певний час теж досить просто. Для цього слід написати таку команду:

Date birthday = new Date(рік, місяць, день, години, хвилини, секунди);

Години, хвилини й секунди нумеруються з нуля: ваш внутрішній програміст може видихнути.

Приклад:

Код Виведення на екран
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Ми задали час 12:15 і дату 4 червня 2005 року. Читається трохи важкувато для непрограміста, натомість працює як треба.


4. Робота із фрагментами дати

Об'єкт Date можна не просто виводити на екран. Він має методи, що дають змогу отримати окремі фрагменти його дати:

Метод Опис
int getYear()
Повертає рік дати відносно 1900 року.
int getMonth()
Повертає місяць дати, місяці нумеруються з нуля
int getDate()
Повертає день місяця
int getDay()
Повертає день тижня
int getHours()
Повертає години
int getMinutes()
Повертає хвилини
int getSeconds()
Повертає секунди

Приклад:

Код Виведення на екран Примітка
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

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.

Приклад:

Код
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Виведення на екран
Jun-04-2005

Подивіться, що програма вивела на екран: 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");

Детальніше парсинг рядків ми розглянемо в інших лекціях.