Рубрики
Без рубрики

Java: Форматирование дат с помощью DateTimeFormatter

В этом уроке мы отформатируем объект LocalDate, LocalTime, LocalDateTime и ZonedDateTime в Java с помощью DateTimeFormatter с примерами, используя как шаблоны, так и перечисления стилей.

Автор оригинала: Mina Krivokuća.

Вступление

Java предоставляет обширный API для обработки даты и времени. В этой статье мы будем использовать Java DateTimeFormatter для форматирования дат – LocalDate , LocalDateTime , LocalTime и ZonedDateTime .

Прежде чем форматировать даты, вы должны знать, как получить текущую дату и время в Java .

Спецификаторы Формата

Спецификаторы формата даты и времени используются для построения шаблонов представления данных в формате, в котором мы хотели бы их представить.

В реальном мире некоторые компоненты даты или времени часто представлены более чем одним способом. Когда дело доходит до спецификаторов формата времени и даты в Java, эти компоненты также имеют два или более представлений – иногда удобно использовать короткую версию, в то время как более длинные версии более лаконичны и официальны.

Форматирование даты и времени

Java 8 переработала API даты/времени с помощью потокобезопасных классов, которые заменили старые и неуклюжие Дата и Календарь классы.

Это также познакомило нас с классом DateTimeFormatter , в отличие от SimpleDateFormat из старого API.

Стоит отметить, что LocalDate и LocalTime хранят информацию только о датах и времени соответственно, в то время как LocalDateTime хранит информацию как о дате, так и о времени в одном объекте.

Существует два способа создания экземпляра DateTimeFormatter :

Написание шаблона:

DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("EEE, MMM dd. yyyy.");

Использование форматера:

DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;

Использование статического метода:

1. DateTimeFormatter.ofLocalizedDate(Стиль формата Стиль даты) 2. DateTimeFormatter.Локализованного времени(Стиль формата Стиль времени) 3. DateTimeFormatter.ofLocalizedDateTime(Стиль форматирования Стиль даты) 4. DateTimeFormatter.ofLocalizedDateTime(Стиль форматирования Стиль даты, Стиль форматирования Стиль времени)

Например, мы могли бы настроить DateTimeFormatter с помощью:

DateTimeFormatter formatter = DateTimeFormatter
        .ofLocalizedTime(FormatStyle.SHORT);

Обратите внимание, что у каждого из них есть обязательный аргумент. Стиль формата -это встроенное перечисление, которое содержит несколько значений – ПОЛНЫЙ , ДЛИННЫЙ , СРЕДНИЙ и КОРОТКИЙ .

Как выглядят доступные шаблоны перечисления при применении к объекту ZonedDateTime , показано в следующей таблице:

Четверг, 13 августа 2020 года 12:43:00 ПО Центральноевропейскому летнему времени Очень подробно ПОЛНЫЙ Четверг, 13 августа 2020 года, 12:43:48 по Центральноевропейскому летнему времени
13 августа 2020 года 12:45:27 УТРА по восточному времени Содержит большинство деталей ДЛИННЫЙ 13 августа 2020 года в 12:44:40 по восточному времени
13 августа 2020 года 12:45:49 УТРА Некоторые детали включали СРЕДНИЙ 13 августа 2020 года, 12:46:29
8/13/20 12:47 УТРА Обычно числовое и максимально короткое КОРОТКИЙ 8/13/20, 12:47 УТРА

Форматирование локального времени

В следующих примерах кода мы покажем, как заставить некоторые из предопределенных форматов выполнять эту работу за нас, а также создавать свои собственные. Для этого требуется всего несколько строк кода:

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
LocalTime time = LocalTime.now();

System.out.println(time.format(formatter));

В результате получается:

5:17:00 AM

Тем не менее, мы должны быть осторожны при использовании предопределенных форматов. В этом случае мы не можем использовать стиль Формат.ДЛИННЫЙ или Стиль формата.ПОЛНЫЙ , потому что они также дают некоторую информацию о часовом поясе, которая обычно не хранится в объекте LocalTime .

Давайте посмотрим, как это выглядит, когда мы создаем наш собственный шаблон:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss a");
LocalTime time = LocalTime.now();
System.out.println(time.format(formatter));

Это выводит:

10:58:28 AM

Конечно, вы можете свободно возиться с шаблоном.

Форматирование LocalDate

Все классы, поддерживаемые DateTimeFormatter , имеют формат(DateTimeFormatter f) метод, поэтому процесс применения шаблона довольно прост:

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
LocalDate d = LocalDate.now();

System.out.println(d.format(formatter));

Этот фрагмент кода дает:

Thursday, August 13, 2020

Форматирование LocalDateTime

Форматирование LocalDateTime выполняется таким же образом:

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.MEDIUM);
LocalDateTime dateTime = LocalDateTime.now();

System.out.println(dateTime.format(formatter));

В результате получается:

August 13, 2020, 5:29:28 AM

Пользовательские шаблоны создаются в аналогичном вопросе:

DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("eee, MMM dd. yyyy.\nHH:mm:ss a");
LocalDateTime dt = LocalDateTime.now();
System.out.println(dt.format(formatter));

Этот фрагмент кода дает:

Tue, Aug 25. 2020.
11:05:20 AM

Форматирование ZonedDateTime

На этот раз мы можем случайно использовать предопределенное форматирование для полного вывода:

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
ZonedDateTime dateTime = ZonedDateTime.now();

System.out.println(dateTime.format(formatter));

Этот фрагмент кода выводит:

Thursday, August 13, 2020 at 5:32:49 AM Central European Summer Time

Когда дело доходит до создания ваших собственных шаблонов для ZonedDateTime , у нас есть полная свобода использовать любой спецификатор, который мы хотели бы:

DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("eee, MMM dd. yyyy.\nHH:mm:ss a - zzzz");
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(dateTime.format(formatter));

Это выводит:

Tue, Aug 25. 2020.
11:09:27 AM - Central European Summer Time

Правила форматирования

Спецификаторы формата для DateTimeFormatter немного отличаются от спецификаторов для SimpleDateFormat . Если вы привыкли работать с SimpleDateFormat , вам придется немного изменить некоторые привычки:

1969;69 И/и Year Год
Август;Август;08 M Номер/Текст Месяц в году
21 w Номер Неделя в году
2 W Номер Неделя в месяце
07;15 d Номер День в месяце
176 D Номер День в году
2:2 квартал:2-й квартал Q / q Номер/Текст Квартал года
2;3 F Номер День недели в месяце (например, второй вторник в этом месяце)
Понедельник;Понедельник;Март E Текст Название дня в неделе
Понедельник;Пн;М;1;01 e / c Номер/Текст Локализованный день в неделе
1 u Номер Номер дня недели )
PM;AM a Текст Маркер Am/pm
12 h Номер Час в am/pm (1-12)
0 H Номер Час в день (0-23)
24 k Номер Час в день (1-24)
0 K Номер Час в am/pm (0-11)
43 m Номер Минута в час
58 s Номер Секунда в минуту
965 S Крупица Доля секунды
1234 A Номер Милли дня
566787434 n Номер Нано второго
56678743400 N Номер Нано дня
Тихоокеанское стандартное время; PST z Название зоны Название часового пояса
Америка/Los_Angeles; Z; -08:30 V Идентификатор зоны Идентификатор часового пояса
Тихоокеанское время; PT0 v Название зоны Название часового пояса
К;Году Господню;А G Текст Обозначение эпохи
  • Текст – Если используется менее 4 символов шаблона, компонент представлен в краткой форме. Ровно 4 символа шаблона будут использовать полную форму, и ровно 5 будут использовать узкую форму.
  • Число – Количество символов шаблона-это минимальное количество цифр. Если это число больше, чем количество цифр, которые нам действительно нужны для представления числа, то к числу добавляется соответствующее количество нулей. c и F может иметь только одно появление, в то время как d , H , h , K , k , m и s может иметь два появления. Только D можно использовать до трех раз.
  • Число/Текст – Если используется 3 или более символов шаблона, компонент представлен в текстовой форме; в противном случае в количестве.
  • Дробь – Возможное количество символов составляет от 1 до 9. Если указано менее 9 из них, значение усекается, выводятся только самые значащие цифры.
  • Год – Если количество символов шаблона равно 2, год усекается до 2 крайних правых цифр, в противном случае он интерпретируется как число.
  • Идентификатор зоны – Если используются 2 символа шаблона, выводится идентификатор зоны; в противном случае создается исключение.
  • Имя зоны – Если символом шаблона является z , выводом будет имя зоны с учетом перехода на летнее время. Если информации недостаточно для определения того, применяется ли летнее время, будет использоваться имя, игнорирующее летнее время. Если количество символов равно 1, 2 или 3, то выводится краткое имя; если 4, то выводится полное имя. Пять или более символов создают исключение. Что касается символа v , DST игнорируется. Если используется 1 символ шаблона, то выводится краткое имя; если используется 4, выводится полное имя. Любое другое количество символов создает исключение.

Вывод

В этой статье мы продемонстрировали, как форматировать LocalDate , LocalTime , LocalDateTime и ZonedDateTime с помощью класса Java DateTimeFormatter .