Автор оригинала: 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
.