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, який розуміє, як і за яким шаблоном слід розпарсити переданий текст.
Ще один приклад: цього разу з парсингом часу.
| Код | Виведення на екран |
|---|---|
|
|
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ