1. Класс DateTimeFormatter

В Date Time API был добавлен специальный класс DateTimeFormatter. Его цель — по максимуму облегчить преобразование даты и времени именно в тот формат, который нужен программисту. И можно сказать, что создателям Java это удалось.

Пользоваться им очень просто. Сначала нужно создать объект класса DateTimeFormatter и передать в него шаблон, по которому будут отображаться дата и время:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern(шаблон);

Где dtf — это переменная типа DateTimeFormatter. DateTimeFormatter.ofPattern() — это статический метод класса DateTimeFormatter. А шаблон — это строка, которая задает шаблон, по которому будут отображаться дата и время.

Примеры

Код Вывод на экран
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MM-dd-yy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


02-22-19

В примере выше мы с помощью метода 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 раза подряд, то год пишется 2 цифрами, если 4 раза подряд — 4-мя цифрами.

Если буква M указывается 2 раза подряд, то пишется номер месяца, если 3 раза подряд, то название месяца (3 первых буквы), если 4 раза подряд, то полное название месяца.

Пример:

Код Вывод на экран
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy");
String text = dtf.format( LocalDateTime.now() );
System.out.println(text);


February-22-2019


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 dtf = DateTimeFormatter.ofPattern("MMMM-dd-yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse("February-23-2019", dtf);
System.out.println(date);


February-23-2019

Сначала мы создаем объект DateTimeFormatter и задаем в нем шаблон парсинга.

Затем вызываем метод LocalDate.parse() или LocalTime.parse() или LocalDateTime.parse() и передаем в этот метод строку, которую нужно распарсить и объект DateTimeFormatter, который понимает, как и по какому шаблону нужно распарсивать переданный текст.

Еще один пример: на этот раз с парсингом времени.

Код Вывод на экран
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime time = LocalTime.parse("23:59:59", dtf);
System.out.println(time);


23:59:59