Научитесь форматировать заданную дату в указанную отформатированную строку в Java. Мы научимся использовать встроенные шаблоны и пользовательские шаблоны с DateTimeFormatter и SimpleDateFormat.
1. Форматирование с помощью DateTimeFormatter [Java 8]
Начиная с Java 8, мы можем использовать DateTimeFormatter для всех типов задач форматирования, связанных с датой и временем. Этот класс потокобезопасен и неизменяем, поэтому его можно использовать в параллельных средах без рисков.
Чтобы отформатировать экземпляр даты в строку, сначала нужно создать экземпляр DateTimeFormatter с желаемым шаблоном вывода, а затем использовать его метод format() для форматирования даты.
1.1 Создание DateTimeFormatter
Мы можем создать DateTimeFormatter тремя способами:
- Использование встроенных шаблонов
- Использование пользовательских шаблонов с использованием метода ofPattern()
- Использование локализованных стилей с 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(), который используется для форматирования объектов даты в строку.