Начиная с Java 16, мы можем использовать дополнительный параметр [B] для форматирования объекта даты-времени с информацией о дате-времени с помощью класса DateTimeFormatter. В этом руководстве обсуждаются подходы до Java 16, а также новый параметр форматирования с примерами.
1. Формат даты с дневным периодом(начиная с Java 16)
Начиная с JDK 16+, мы можем выйти за рамки флагов AM/PM и форматировать строки даты и времени по следующим шаблонам с помощью нового параметра pattern: B.
- утром
- днем
- вечером
- ночью
Этот шаблон доступен, начиная с JDK 16+, с использованием классов DateTimeFormatter и DateTimeFormatterBuilder.
Следующая программа демонстрирует использование шаблона «B», представляющего период дня:
public static String formatSinceJava16(LocalDateTime ldt, ZoneId zoneId) {ZonedDateTime zdt = ldt.atZone(zoneId);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd [B]");return zdt.withZoneSameInstant(zoneId).format(formatter);}
Мы можем использовать этот метод для печати местной даты и времени(с информацией о дневном времени) следующим образом:
LocalDateTime ldt = LocalDateTime.now();String formattedDateTime = formatSinceJava16(ldt, ZoneId.systemDefault());System.out.println(formattedDateTime);
Вывод программы:
2024-Jan-21 in the afternoon
2. Формат даты с дневным периодом(до Java 16)
До Java 16, если нам требовалось создать какой-либо подобный форматированный вывод, нам приходилось писать нашу логику и добавлять такие строки в уже отформатированную строку даты и времени.
LocalTime night = LocalTime.of(21, 0, 0);LocalTime morning = LocalTime.of(6, 0, 0);LocalTime afternoon = LocalTime.of(12, 0, 0);LocalTime evening = LocalTime.of(18, 0, 0);LocalTime almostMidnight = LocalTime.of(23, 59, 59);LocalTime midnight = LocalTime.of(0, 0, 0);public String formatBeforeJava16(LocalDateTime localDateTime, ZoneId zoneId) {ZonedDateTime zdt = localDateTime.atZone(zoneId);LocalTime lt = zdt.toLocalTime();DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyy-MMM-dd");String dayTime = "";if((lt.isAfter(night) && lt.isBefore(almostMidnight))|| lt.isAfter(midnight) &&(lt.isBefore(morning))) {dayTime = " at night";} else if(lt.isAfter(morning) && lt.isBefore(afternoon)) {dayTime = " in the morning";} else if(lt.isAfter(afternoon) && lt.isBefore(evening)) {dayTime = " in the afternoon";} else if(lt.isAfter(evening) && lt.isBefore(night)) {dayTime = " in the evening";}return zdt.withZoneSameInstant(zoneId).format(formatter) + dayTime;}
Приведенный выше код определяет константы для определенного времени суток, проверяет аргумент LocalTime для определения времени суток и устанавливает переменную dayTime соответствующим образом. Наконец, он возвращает отформатированную строку, представляющую дату и описание времени суток.
LocalDateTime ldt = LocalDateTime.now();String formattedDateTime = DayPeriodFormatter.formatBeforeJava16(ldt, ZoneId.systemDefault());System.out.println(formattedDateTime);
Вывод программы:
2024-Jan-21 in the afternoon
3. Резюме
В этом коротком руководстве по Java мы обсудили способы форматирования LocalDateTime в шаблон, содержащий информацию о дне времени. Мы обсудили декларативный подход до Java 16, а затем продемонстрировали использование нового параметра шаблона [B] с примерами каждого.