Представленный в изменениях API даты и времени Java 8, класс DateTimeFormatter помогает единообразно анализировать и печатать объекты даты и времени в различных встроенных и пользовательских шаблонах форматирования. Его экземпляры потокобезопасны и неизменяемы ; и могут использоваться без возникновения проблем с параллелизмом.
В этом уроке мы научимся создавать экземпляр DateTimeFormatter и использовать предопределенные и пользовательские шаблоны для форматирования следующих типов:
- ЗонированныйДатаВремя
- ЛокальнаяДатаВремя
- Локальная дата
- Местное время
// Создание DateTimeFormatter для информации о дате и времени, включая часовой поясpublic static final DateTimeFormatter ZDT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss az");//ФорматированиеСтрока formettedOutput = ZDT_FORMATTER.format( ZonedDateTime.now() ); //2023-04-26 15:28:29 IST//РазборZonedDateTime zdt = ZonedDateTime.parse(inputString, ZDT_FORMATTER); //inputString предоставляется пользователем
1. Шаблоны форматирования, используемые с DateTimeFormatter
Экземпляр DateTimeFormatter всегда связан с шаблоном форматирования, с которым он создан. Мы можем использовать встроенный шаблон или предоставить пользовательский шаблон.
1.1. Готовые экземпляры
Существует два способа ссылаться на встроенные шаблоны:
- Использование готовых экземпляров DateTimeFormatter, таких как ISO_DATE, ISO_LOCAL_DATE, BASIC_ISO_DATE, ISO_LOCAL_DATE_TIME, RFC_1123_DATE_TIME и т. д. Большинство экземпляров соответствуют стандарту ISO-8601.
DateTimeFormatter.ISO_LOCAL_DATE.format(LocalDate.of(2023, 4, 25));
- Использование одного из следующих готовых локализованных стилей с FormatStyle.
ФорматСтиль | Пример шаблона |
---|---|
ПОЛНЫЙ | Вторник, 25 апреля 2023 г. |
ДЛИННЫЙ | 25 апреля 2023 г. |
СЕРЕДИНА | 25 апр. 2023 г. |
КОРОТКИЙ | 4/25/23 |
DateTimeFormatter customFormatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.LONG );
1.2 Пользовательские шаблоны
Мы можем предоставить пользовательский шаблон, созданный с использованием символов шаблона, таких как «uuuu-MMM-dd», и использовать метод ofPattern() для создания нового экземпляра.
DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mma z");
1.3. DateTimeFormatterBuilder для построения сложных шаблонов
Используйте DateTimeFormatterBuilder для создания более сложного экземпляра форматировщика.
DateTimeFormatter formatter = new DateTimeFormatterBuilder().parseCaseInsensitive().append(DateTimeFormatter.ISO_LOCAL_DATE_TIME).optionalStart().appendPattern(".SSS").optionalEnd().optionalStart().appendZoneOrOffsetId().optionalEnd().optionalStart().appendOffset("+HHMM", "0000").optionalEnd().toFormatter();
2. Форматирование с помощью DateTimeFormatter
2.1 Синтаксис
Класс DateTimeFormatter предоставляет в основном один метод для форматирования заданного экземпляра даты-времени типа TemporalAccessor, который является базовым типом интерфейса для объектов даты, времени и смещения. Он форматирует экземпляр dateTimeObject, используя указанный формат.
String formattedOutput = formatter.format(TemporalAccessor temporal);
2.2. Формат ZonedDateTime, LocalDateTime, LocalDate, LocalTime
Мы видели пример форматирования ZonedDateTime в предыдущем разделе. Давайте научимся форматировать другие классы.
LocalDateTime не имеет части часового пояса, поэтому создайте соответствующий шаблон.
static final DateTimeFormatter FOMATTER = DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mm a");String output = FOMATTER.format( LocalDateTime.now() ); // 07/15/2018 at 02:49 PM
LocalDate не имеет частей времени и часового пояса. Поэтому создайте шаблон соответствующим образом.
static final DateTimeFormatter FOMATTER = DateTimeFormatter.ofPattern("MM/dd/yyyy");String dateString = FOMATTER.format( LocalDate.now() ); // 07/15/2018
LocalTime не содержит частей даты и часового пояса, поэтому создайте соответствующий шаблон.
static final DateTimeFormatter FOMATTER = DateTimeFormatter.ofPattern("hh:mm a");String localTimeString = FOMATTER.format( LocalTime.now() ); // 02:53 PM
3. Анализ с помощью DateTimeFormatter
Мы можем использовать любой из созданных выше экземпляров DateTimeFormatter в методе parse(), чтобы получить экземпляр этого объекта даты/времени.
public static final DateTimeFormatter ZDT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss a z");ZonedDateTime zdt = ZonedDateTime.parse( str, ZDT_FORMATTER );
4. Полезные пользовательские шаблоны для справки
Пользовательские шаблоны строятся с использованием специальных букв, которые имеют особое значение во время форматирования или анализа. Вот некоторые общие символы шаблонов:
- 'г': год
- «М»: месяц(в числовой форме, например, «1» для января)
- «МММ»: сокращение месяца(например, «Янв»)
- «ММММ»: полное название месяца(например, «Январь»)
- 'd': день месяца
- «E»: сокращение дня недели(например, «Пн»)
- «EEEE»: полное название дня недели(например, «Понедельник»)
- 'h': час(в формате 1-12)
- «H»: час(в формате 0-23)
- «м»: минута
- 'с': второй
- «S»: доля секунды
- «a»: маркер AM/PM
- «z»: сокращение часового пояса(например, «PST»)
- «Z»: смещение часового пояса(например, «-0800»)
Используя приведенные выше буквы, мы создали следующие готовые к использованию пользовательские шаблоны.
Шаблон | Пример |
---|---|
гггг-ММ-дд( ISO ) | «2018-07-14» |
дд-МММ-гггг | «14-июл-2018» |
дд/ММ/гггг | «14/07/2018» |
Е, МММ дд гггг | «Сб, 14 июля 2018» |
ч:мм а | «12:08 PM» |
EEEE, MMM дд, гггг ЧЧ:мм:сс а | «Суббота, 14 июля 2018 г., 14:31:06» |
гггг-ММ-дд'Т'ЧЧ:мм:ссZ | «2018-07-14T14:31:30+0530» |
чч 'o''clock' a, zzzz | «12 часов дня по тихоокеанскому летнему времени» |
К:мм а, я | «00:08 PM, PDT» |