Форматирование даты в строку в Java

Научитесь форматировать заданную дату в указанную отформатированную строку в Java. Мы научимся использовать встроенные шаблоны и пользовательские шаблоны с DateTimeFormatter и SimpleDateFormat.

1. Форматирование с помощью DateTimeFormatter [Java 8]

Начиная с Java 8, мы можем использовать DateTimeFormatter для всех типов задач форматирования, связанных с датой и временем. Этот класс потокобезопасен и неизменяем, поэтому его можно использовать в параллельных средах без рисков.

Чтобы отформатировать экземпляр даты в строку, сначала нужно создать экземпляр DateTimeFormatter с желаемым шаблоном вывода, а затем использовать его метод format() для форматирования даты.

1.1 Создание DateTimeFormatter

Мы можем создать DateTimeFormatter тремя способами:

  1. Использование встроенных шаблонов
  2. Использование пользовательских шаблонов с использованием метода ofPattern()
  3. Использование локализованных стилей с FormatStyle, например long или medium
//Use inbuilt pattern constantsDateTimeFormatter inBuiltFormatter1 = DateTimeFormatter.ISO_DATE_TIME;DateTimeFormatter inBuiltFormatter2 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;//Define your own custom patternsDateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy 'at' hh:mma z");//Using FormatStyleDateTimeFormatter customFormatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);

Подробнее: Класс DateTimeFormatter

1.2. Форматирование ZonedDateTime, LocalDateTime и LocalDate

Класс DateTimeFormatter предоставляет методы String format(TemporalAccessor temporal), которые можно использовать для форматирования экземпляров ZonedDateTime, LocalDateTime и LocalDate.

import java.time.LocalDate;import java.time.LocalDateTime;import java.time.ZonedDateTime;import java.time.format.DateTimeFormatter;public class FormattingDates {public static final String ZDT_PATTERN = "yyyy-MM-dd HH:mm:ss a z";public static final DateTimeFormatter ZDT_FORMATTER= DateTimeFormatter.ofPattern(ZDT_PATTERN);public static final String LDT_PATTERN = "yyyy-MM-dd HH:mm:ss a";public static final DateTimeFormatter LDT_FORMATTER= DateTimeFormatter.ofPattern(LDT_PATTERN);public static final String LD_PATTERN = "yyyy-MM-dd";public static final DateTimeFormatter LD_FORMATTER= DateTimeFormatter.ofPattern(LD_PATTERN);public static void main(String[] args) {String instanceString = ZDT_FORMATTER.format(ZonedDateTime.now());System.out.println(instanceString);String dateTimeString = LDT_FORMATTER.format(LocalDateTime.now());System.out.println(dateTimeString);String dateString = LD_FORMATTER.format(LocalDate.now());System.out.println(dateString);}}

1.2 Создание пользовательских шаблонов

Пользовательская строка шаблона может иметь любое количество предопределенных букв и символов, которые имеют свое собственное значение. Наиболее используемые символы: Y, M, D, h, m и s.

Также обратите внимание, что количество повторений буквы в шаблоне также имеет разные значения. Например, «MMM» дает «Jan», тогда как «MMMM» дает «January».

Давайте рассмотрим эти символы для быстрой справки.

Символ Значение Тип Пример
Г Эра Нить н.э.; Anno Domini
у Год эры Год 2004 или 04
ты Год эры Год Аналогично «y», но возвращает пролептический год.
Д День года Число 235
М/Л Месяц года Число/Строка 7 или 07; J или Jul или июль
г День месяца Число 21
К/к Квартал года Число/Строка 3 или 03; Q3 или 3-й квартал
И Недельный год Год 1996 или 96
ж Неделя за неделей на основе года Число 32
Вт Неделя месяца Число 3
э / с Локализованный день недели Число/Строка 2 или 02; T или Вт или Вторник
Э День недели Нить T или Вт или Вторник
Ф Неделя месяца Число 3
а утро / вечер дня Нить ПМ
час Часовой пояс am pm(1-12) Число 12
К Время утра вечера(0-11) Число 0
к Часовой пояс am pm(1-24) Число 15
ЧАС Час дня(0-23) Число 15
м Минута часа Число 30
с Секунда минуты Число 55
С Доля секунды Дробь 978
А Миллисекунда дня Число 1234
н Наносекунда секунды Число 987654321
Н Наносекунда дня Число 1234560000
В Идентификатор часового пояса Зона-id Америка/Лос-Анджелес или Z или –08:30
з Название часового пояса Имя зоны Тихоокеанское стандартное время или PST
Х Смещение зоны Z для нуля Смещение-X Z или –08 или –0830 или –08:30 или –083015 или –08:30:15
х Смещение зоны Смещение-x +0000 или –08 или –0830 или –08:30 или –083015 или –08:30:15
З Смещение зоны Смещение-Z +0000 или –0800 или –08:00
О Смещение локализованной зоны Смещение-О GMT+8 или GMT+08:00 или UTC–08:00
п Прокладка следующая Модификатор прокладки 1

1.4. Исключение неподдерживаемого временного типа

Если мы попытаемся использовать DateTimeFormatter с шаблоном, который не поддерживается экземпляром даты и времени, его format() выдаст это исключение.

Например, если мы попытаемся отформатировать LocalDate с помощью шаблона, содержащего часы и минуты, то будет выдано это исключение, поскольку LocalDate не поддерживает какую-либо информацию о времени.

public static final String TIMESTAMP_PATTERN= "yyyy-MM-dd HH:mm:ss a";public static final DateTimeFormatter FOMATTER= DateTimeFormatter.ofPattern(TIMESTAMP_PATTERN);String formmatedString = FOMATTER.format( LocalDate.now() );
Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDayat java.base/java.time.LocalDate.get0(LocalDate.java:709)at java.base/java.time.LocalDate.getLong(LocalDate.java:688)...

2. Форматирование с помощью SimpleDateFormat [Java 7]

Если вы все еще используете Java 7 и не можете выполнить обновление из-за зависимостей некоторых устаревших приложений, вы можете использовать SimpleDateFormat для форматирования даты с учетом локали.

Хотя SimpleDateFormat не является потокобезопасным или неизменяемым, он все же хорошо служит своей цели. Не используйте этот класс в многопоточной среде без дополнительной синхронизации.

2.1 Создание SimpleDateFormat

SimpleDateFormat предоставляет следующие конструкторы:

  • SimpleDateFormat(pattern): использует заданный шаблон и символы формата даты по умолчанию для локали по умолчанию.
  • SimpleDateFormat(шаблон, локаль): использует заданный шаблон и символы формата даты по умолчанию для заданной локали.
  • SimpleDateFormat(pattern, formatSymbols): использует заданный шаблон и символы формата даты.
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM-dd-yyyy");SimpleDateFormat simpleDateFormat =new SimpleDateFormat("MM-dd-yyyy", new Locale("fr", "FR"));DateFormatSymbols symbols = new DateFormatSymbols(Locale.getDefault());symbols.setAmPmStrings(new String[] { "AM", "PM" }); //Override specific symbols and retaining otherssdf.setDateFormatSymbols(symbols);

2.2 Преобразование даты в строку

Теперь мы можем использовать созданный экземпляр SimpleDateFormat для форматирования заданного объекта Date в строку.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");String formattedDate = sdf.format(new Date());System.out.println(formattedDate);String pattern = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";SimpleDateFormat sdfWithLocale =new SimpleDateFormat(pattern,new Locale("fr", "FR"));String date = sdfWithLocale.format(new Date());System.out.println(date);DateFormatSymbols symbols = new DateFormatSymbols(Locale.getDefault());symbols.setAmPmStrings(new String[] { "AM", "PM" });sdf.setDateFormatSymbols(symbols);formattedDate = sdf.format(new Date());System.out.println(formattedDate);

Вывод программы.

2022-02-17 21:57:01 pmjeudi février 2022 21:57:01.644+05302022-02-17 21:57:01 PM

3. Заключение

Если у вас есть возможность обновить приложение Java 7 до последней версии Java, пожалуйста, сделайте это в первую очередь. Потокобезопасная и неизменяемая природа DateTimeFormatter — это огромный выигрыш с точки зрения производительности по сравнению с SimpleDateFormat.

Оба класса предоставляют пример format(), который используется для форматирования объектов даты в строку.

Исходный код Скачать

Прокрутить вверх