1. Клас DateTimeFormatter
У Date Time API було додано спеціальний клас DateTimeFormatter
. Його призначення — максимально полегшити перетворення дати й часу саме в той формат, який потрібен програмісту. І можна сказати, що авторам Java це вдалося.
Користуватися цим класом дуже просто. Спочатку потрібно створити об'єкт класу DateTimeFormatter
і передати в нього шаблон, за яким відображатимуться дата й час:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(шаблон);
де dtf
— це змінна типу DateTimeFormatter
, DateTimeFormatter.ofPattern()
— це статичний метод класу DateTimeFormatter
, а шаблон — це рядок, що задає шаблон, за яким відображатимуться дата й час.
Приклади
Код | Виведення на екран |
---|---|
|
|
У прикладі вище ми за допомогою методу ofPattern()
створюємо об'єкт DateTimeFormatter
на основі рядка-шаблону. А в наступному рядку за допомогою методу format()
перетворюємо об'єкт типу LocalDateTime
на рядок. Результат ви бачите на екрані.
У метод format()
можна передати практично будь-який об'єкт із Date Time API.
Статичний метод ofPattern()
теж дуже простий: отримує як параметр рядок-шаблон, а повертає об'єкт типу DateTimeFormatter
. Найцікавіше міститься всередині шаблону.
2. Шаблон форматування
Рядок, переданий параметром, використовується як шаблон під час виведення інформації. MM замінюється на номер місяця, dd — на день місяця, yy — на номер року. Регістр літер має значення.
Повна таблиця перетворення часу має такий вигляд:
Літера | Позначення |
---|---|
y | Рік (Year) |
M | Місяць (Month) |
d | День (day) |
H | Години (Hours) |
m | Хвилини (Minutes) |
s | Секунди (Seconds) |
S | Мілісекунди |
n | Наносекунди |
Взагалі, запам'ятати не складно.
А чому тоді в шаблоні з прикладу літери MM, dd та yy написані по два рази? А це вже цікавіше.
Загальна ідея
Кількість літер впливає на довжину тексту. Що більше літер, то довшим буде текст.
Якщо літеру H вказано один раз, то 9 година відображатиметься як 9, а якщо літеру H указано двічі поспіль, то 9 година відображатиметься як 09.
Якщо літеру y вказано двічі поспіль, то рік пишеться 2 цифрами, якщо 4 рази поспіль — 4-мя цифрами.
Якщо літеру M вказано двічі поспіль, то пишеться номер місяця, якщо тричі поспіль, то назва місяця (3 перші літери), якщо 4 рази поспіль, то повна назва місяця.
Приклад:
Код | Виведення на екран |
---|---|
|
|
3. Повна таблиця шаблонів
Повна таблиця досить велика й дуже цікава:
Шаблон | Варіанти шаблону | Приклад | Опис |
---|---|---|---|
y | yy, yyyy | 19; 2019 | Рік |
M/L | M, MM, MMM, MMMM, MMMMM | 1; 01; Jan; January; J | Місяць |
d | d, dd | 9; 09 | День |
H | H, HH | 2; 02 | Години |
m | m, mm | 3; 03 | Хвилини |
s | s, ss | 5; 05 | Секунди |
S | S, SS, SSS, ... | 1; 12; 123 | Мілісекунди |
n | n | 123456789 | Наносекунди |
G | G, GGGG, GGGGG | AD; Anno Domini; A; | Ера |
Q/q | q, qq, qqq, qqqq | 3; 03; Q3; 3rd quarter | Квартал |
w | w | 13 | Тиждень року |
W | W | 3 | Тиждень місяця |
E | EEE, EEEE, EEEEE | Mon; Monday; M | День тижня |
e/c | e, ee, eee, eeee, eeeee | 1; 01; Mon; Monday; M | День тижня |
a | a | PM | AM або PM |
h | h | 12 | Час 1–12 годин |
V | VV | Europe/Helsinki | Часова зона |
z | z zzzz | EET; Eastern European Standard Time | Часова зона |
O | O OOOO | GMT+2; GMT+02:00 | Часова зона |
Це, до речі, ще неповний список. Повний знаходиться за посиланням:
https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/time/format/DateTimeFormatter.html
4. Парсинг часу
Клас DateTimeFormatter
цікавий ще й тим, що може не тільки перетворювати дату й час на рядок за заданим шаблоном, але й виконувати зворотну операцію!
Аналіз і розбір рядка називають парсингом, від слова parse.
Отакий вигляд має цей процес:
Код | Виведення на екран |
---|---|
|
|
Спочатку ми створюємо об'єкт DateTimeFormatter
і задаємо в ньому шаблон парсингу.
Відтак викликаємо метод LocalDate.parse()
або LocalTime.parse()
, або LocalDateTime.parse()
і передаємо в цей метод рядок, який потрібно розпарсити, і об'єкт DateTimeFormatter
, який розуміє, як і за яким шаблоном слід розпарсити переданий текст.
Ще один приклад: цього разу з парсингом часу.
Код | Виведення на екран |
---|---|
|
|
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ