Форматирование и разбор дат
По умолчанию даты выводятся в формате 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–23 | 09 |
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 означает «год недели», который в последние дни декабря может отличаться от обычного года. Сверяйте шаблон с таблицей выше.