JavaRush /Курсы /Java Syntax Pro /Отображение времени - форматирование

Отображение времени - форматирование

Java Syntax Pro
16 уровень , 7 лекция
Открыта

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


Комментарии (165)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Руслан Уровень 48
6 сентября 2025
Как по мне классы из этого пакета довольно простые и очень даже понятно что зачем Лекция очень годная
I'll kick them all Уровень 5
29 июля 2025
Лайк если помнишь Ellie
Anonymous #3585174 Уровень 33
19 июля 2025
Like
Dirk Gently Уровень 1
22 апреля 2025
Лайк, если уже забыл про Анжелику))
25 апреля 2025
Любо
Олег Сычев Уровень 29
2 мая 2025
Кто такая Анжелика то? Периодически в комментариях вижу, то про Анжелику, то про комикс какой-то, но никто не рассказывает в чем прикол, откуда эти персонажи и что за комиксы :/
Agent_Pandora Уровень 26
4 апреля 2025
эта лекция) мед по телу-мед по телуу
Cryptosin Уровень 24
9 февраля 2025
я не понимаю....все эти даты перемешались в голове и тупо каша. что, куда, зачем? а хз...
Артём Сёмкин Уровень 47
4 декабря 2024
Оказывается, что я азиат....
18 декабря 2024
Все правильно. За Уралом Азия.
Ilya Klimchev Уровень 1
16 января 2025
А кем ты себя ощущал?)
Aleksei Уровень 19
16 февраля 2025
Поздравляю, ты прозрел))) Интересно в каком возрасте ты это узнал))))
Rustam Уровень 3 Student
14 октября 2024
Интересно, в каких задачах используют это в разработке
NodeOne Уровень 41 Expert
13 января 2025
Во всех! Почти во всех прикладных приложениях приходится гонять даты между фронтом и бэком. Ну и естественно, что с фронта приходит всякое (в виде текста) - наша задача это всякое взять и красиво уложить в бэк... ну а потом опять отдать фронту, так, что бы он понял. Тема очень востребованная.
Александр Уровень 19
9 октября 2024
Впервые скипаю задачи не из-за того, что сложно или не интересно. А потому, что слишком узконаправленная тема. Пока буду проходить следующие эти забудутся. Кажется, что все-равно к мануалу возвращаться при необходимости проще, чем сейчас зубриться тут сидеть. Теперь шизофреник во мне уверен, что первые рабочие проекты по-любому будут использовать эти классы и я буду вспоминать об этих скипнутых задачах и жалеть, что не уделил должного внимания им тогда.
Sergo Уровень 22
4 октября 2024
тупо скипнул, или уже перегораю или магнитные бури на меня так влияют
NightCrow Уровень 27
10 октября 2024
Тема очень нудная и все равно забудешь. Здесь вам не тут, это не циклам хвосты крутить. )))) Но для общего развития думаю полезно.
Yasin Akhmadov Уровень 22
14 февраля 2025
А эти темы вообще пригодятся в работе???
Евгений Уровень 37
20 марта 2025
Почти во всех прикладных приложениях приходится гонять даты между фронтом и бэком. Ну и естественно, что с фронта приходит всякое (в виде текста) - наша задача это всякое взять и красиво уложить в бэк... ну а потом опять отдать фронту, так, что бы он понял. Тема очень востребованная.