Формат даты Java с указанием периода суток (утро, день, вечер и ночь)

Начиная с 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] с примерами каждого.

Исходный код на Github

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