Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Форматирование и разбор дат

По умолчанию даты выводятся в формате ISO: 2026-10-04. Это удобно для программ, но не для людей — в России привыкли к 04.10.2026, в США к 10/04/2026. Перевести дату в строку нужного вида и обратно помогает класс DateTimeFormatter.

Шаблон формата

Шаблон описывает, как выглядит дата: каждая буква обозначает свою часть. DateTimeFormatter.ofPattern создаёт форматировщик, а метод format у даты применяет его:

void main() {
    LocalDate date = LocalDate.of(2026, 10, 4);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
 
    IO.println(date.format(formatter));
}

Результат:

04.10.2026

Все символы, которые не являются буквами шаблона, — точки, дефисы, пробелы — выводятся как есть.

Буквы шаблона

Самые нужные буквы:

БукваЗначениеПример
yyyyгод2026
MMмесяц числом10
MMMMназвание месяцаоктября
ddдень месяца04
EEEEдень неделивоскресенье
HHчасы, 0–2309
mmминуты05
ssсекунды00

Сколько раз повторена буква, влияет на вид: M даёт 10, MMM — сокращение окт., MMMM — полное название.

void main() {
    LocalDateTime start = LocalDateTime.of(2026, 10, 4, 9, 5);
 
    IO.println(start.format(DateTimeFormatter.ofPattern("HH:mm")));
    IO.println(start.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}

Результат:

09:05
2026-10-04 09:05:00

Названия на русском

Названия месяцев и дней недели зависят от языка. Его задают объектом Locale вторым аргументом ofPattern:

void main() {
    LocalDate date = LocalDate.of(2026, 10, 4);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE, d MMMM yyyy", Locale.of("ru"));
 
    IO.println(date.format(formatter));
}

Результат:

воскресенье, 4 октября 2026

Если язык не указать, Java возьмёт язык операционной системы, и вывод будет разным на разных компьютерах.

Разбор строки

Обратная операция — разбор (parsing): превратить строку в дату. Метод LocalDate.parse принимает строку и тот же форматировщик:

void main() {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
 
    LocalDate date = LocalDate.parse("25.12.2026", formatter);
 
    IO.println(date);
    IO.println(date.getDayOfWeek());
}

Результат:

2026-12-25
FRIDAY

Строку в формате ISO, например 2026-12-25, можно разобрать вовсе без форматировщика: LocalDate.parse("2026-12-25"). Если строка не подходит под шаблон, выбрасывается DateTimeParseException.

Готовые форматы

Для обмена данными между программами есть готовые форматировщики, например DateTimeFormatter.ISO_LOCAL_DATE. А для людей — ofLocalizedDate, который выбирает принятый в стране вид даты:

void main() {
    LocalDate date = LocalDate.of(2026, 10, 4);
 
    IO.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE));
    IO.println(date.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(Locale.of("ru"))));
    IO.println(date.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(Locale.US)));
}

Результат:

2026-10-04
4 октября 2026 г.
10/4/26

Частая ошибка

Буквы шаблона чувствительны к регистру: MM — это месяц, а mm — минуты. У LocalDate нет минут, поэтому такой шаблон приводит к исключению:

void main() {
    LocalDate date = LocalDate.of(2026, 10, 4);
 
    IO.println(date.format(DateTimeFormatter.ofPattern("dd.mm.yyyy")));
}

Результат:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: MinuteOfHour
	at Main.main(Main.java:4)

Похожая ловушка — YYYY вместо yyyy: заглавная Y означает «год недели», который в последние дни декабря может отличаться от обычного года. Сверяйте шаблон с таблицей выше.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.