JavaRush /Курси /JAVA 25 SELF /Форматування та парсинг дат: DateTimeFormatter

Форматування та парсинг дат: DateTimeFormatter

JAVA 25 SELF
Рівень 13 , Лекція 4
Відкрита

1. DateTimeFormatter: що це таке і навіщо він потрібен

У реальних програмах дати рідко живуть лише всередині коду. Зазвичай їх потрібно:

  • Перетворювати на рядок для виведення в консоль, на екран або у файл (наприклад, "01.06.2025 14:30").
  • Парсити рядок, тобто перетворювати рядок, введений користувачем або отриманий із файлу, назад на об’єкт дати/часу.

Для цього в Java є потужний і зручний інструмент — клас java.time.format.DateTimeFormatter.

Можна сказати, що DateTimeFormatter — це перекладач між об’єктами часу (LocalDate, LocalDateTime, ZonedDateTime, Instant та ін.) та рядками. Він вміє:

  • Перетворювати об’єкти дат/часу на рядки в потрібному форматі (format — форматування).
  • Перетворювати рядки на об’єкти дат/часу (parse — парсинг).

2. Стандартні форматери: швидко й просто

Java дбайливо підготувала для вас набір стандартних форматерів, що охоплюють найпопулярніші формати ISO (міжнародні стандарти дати й часу).

Ось деякі з них:

Форматер Приклад рядка Опис
DateTimeFormatter.ISO_LOCAL_DATE
2025-06-01 Лише дата (рік‑місяць‑день)
DateTimeFormatter.ISO_LOCAL_TIME
14:30:00 Лише час (години:хвилини:секунди)
DateTimeFormatter.ISO_LOCAL_DATE_TIME
2025-06-01T14:30:00 Дата й час без часового поясу
DateTimeFormatter.ISO_ZONED_DATE_TIME
2025-06-01T14:30:00+03:00[Europe/Kyiv] Дата, час і часовий пояс

Приклад використання стандартного форматера

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class FormatterDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        // Форматуємо дату в рядок
        String text = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(text); // Наприклад, 2025-06-01

        // Парсимо рядок назад у дату
        LocalDate parsed = LocalDate.parse("2025-06-01", DateTimeFormatter.ISO_LOCAL_DATE);
        System.out.println(parsed); // 2025-06-01
    }
}

Аналогія

Якби Java була кавʼярнею, стандартні форматери — це «американо», «лате» та «еспресо». Швидко, стандартно та іноді хочеться чогось особливого!

3. Власні шаблони: DateTimeFormatter.ofPattern

Іноді стандартних форматів замало. Наприклад, потрібно вивести дату у вигляді "01.06.2025 14:30", а не "2025-06-01T14:30:00". Для цього ви можете створити власний шаблон за допомогою методу DateTimeFormatter.ofPattern(String pattern).

Синтаксис шаблонів

У шаблоні використовують спеціальні символи:

  • y — рік (yyyy2025)
  • M — місяць (MM06)
  • d — день (dd01)
  • H — година (24‑годинний формат, HH14)
  • m — хвилини (mm30)
  • s — секунди (ss00)

Приклади шаблонів

Шаблон Приклад результату
"dd.MM.yyyy"
01.06.2025
"yyyy/MM/dd"
2025/06/01
"dd.MM.yyyy HH:mm"
01.06.2025 14:30
"yyyy-MM-dd HH:mm:ss"
2025-06-01 14:30:00
"d MMMM yyyy"
1 червня 2025

Приклад: форматування дати й часу

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class CustomFormatDemo {
    public static void main(String[] args) {
        LocalDateTime dt = LocalDateTime.of(2025, 6, 1, 14, 30);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        String text = dt.format(formatter);
        System.out.println(text); // 01.06.2025 14:30
    }
}

Приклад: парсинг рядка в дату

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class ParseDemo {
    public static void main(String[] args) {
        String input = "01.06.2025 14:30";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        LocalDateTime dt = LocalDateTime.parse(input, formatter);
        System.out.println(dt); // 2025-06-01T14:30
    }
}

Увага: шаблон має точно відповідати рядку! Якщо в рядку є секунди — додайте :ss у шаблон.

4. Форматування: перетворюємо дату/час у рядок

Загальна схема

  1. Створюємо потрібний об’єкт (LocalDate, LocalDateTime, ZonedDateTime тощо).
  2. Створюємо або обираємо потрібний форматер.
  3. Викликаємо в об’єкта метод format(DateTimeFormatter), отримуємо рядок.

Приклад: виводимо дату в різних форматах


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class MultiFormatDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 6, 1);

        // Стандартний ISO
        System.out.println(date.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2025-06-01

        // Власний формат
        DateTimeFormatter uaFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        System.out.println(date.format(uaFormat)); // 01.06.2025

        // Англійський стиль
        DateTimeFormatter usFormat = DateTimeFormatter.ofPattern("MM/dd/yyyy");
        System.out.println(date.format(usFormat)); // 06/01/2025
    }
}

Форматування часу

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class TimeFormatDemo {
    public static void main(String[] args) {
        LocalTime time = LocalTime.of(14, 30, 5);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        System.out.println(time.format(formatter)); // 14:30:05
    }
}

5. Парсинг: перетворюємо рядок у дату/час

Загальна схема

  1. Отримуємо рядок (наприклад, від користувача).
  2. Створюємо форматер із тим самим шаблоном, що й у рядку.
  3. Викликаємо статичний метод parse() або метод parse() об’єкта форматера.

Приклад: парсинг дати

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class ParseDateDemo {
    public static void main(String[] args) {
        String input = "01.06.2025";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        LocalDate date = LocalDate.parse(input, formatter);
        System.out.println(date); // 2025-06-01
    }
}

Приклад: парсинг дати й часу

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class ParseDateTimeDemo {
    public static void main(String[] args) {
        String input = "01.06.2025 14:30";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm");
        LocalDateTime dateTime = LocalDateTime.parse(input, formatter);
        System.out.println(dateTime); // 2025-06-01T14:30
    }
}

6. Обробка помилок парсингу

Парсинг — річ підступна. Якщо рядок не підходить під шаблон, Java згенерує виняток DateTimeParseException. Це типова ситуація, наприклад, якщо користувач ввів дату з помилкою.

Приклад: обробка помилок під час парсингу

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class ParseErrorDemo {
    public static void main(String[] args) {
        String input = "32.13.2025"; // Некоректна дата
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        try {
            LocalDate date = LocalDate.parse(input, formatter);
            System.out.println(date);
        } catch (DateTimeParseException ex) {
            System.out.println("Помилка парсингу: " + ex.getMessage());
        }
    }
}

Важливо: завжди обробляйте такі помилки, якщо працюєте з користувацьким введенням!

7. Практика: перетворення дат для користувача

Припустімо, у нашому навчальному застосунку є завдання: користувач вводить дату народження у форматі "дд.ММ.рррр", а програма має вивести дату у форматі "yyyy/MM/dd", а також день тижня.

Приклад

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Scanner;

public class BirthdayFormatDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введіть дату народження (дд.ММ.рррр): ");
        String input = scanner.nextLine();

        DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy/MM/dd");

        try {
            LocalDate birthday = LocalDate.parse(input, inputFormat);
            String formatted = birthday.format(outputFormat);
            System.out.println("Ваша дата в новому форматі: " + formatted);
            System.out.println("День тижня: " + birthday.getDayOfWeek()); // Наприклад, SATURDAY
        } catch (DateTimeParseException ex) {
            System.out.println("Помилка: некоректний формат дати!");
        }
    }
}

8. Локалізація: як мова впливає на форматування

За допомогою DateTimeFormatter можна не лише змінювати порядок чисел, а й виводити місяць словами, день тижня тощо. При цьому враховується локаль (мова та регіон).

Приклад

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class LocaleDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 6, 1);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", new Locale("uk"));
        System.out.println(date.format(formatter)); // 1 червня 2025
    }
}

Приклад: англійська локаль

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class LocaleEnDemo {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2025, 6, 1);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d MMMM yyyy", Locale.ENGLISH);
        System.out.println(date.format(formatter)); // 1 June 2025
    }
}

Порада: якщо хочете, щоб місяць і день тижня були потрібною мовою — вказуйте локаль явно!

9. Типові помилки під час форматування та парсингу дат

Помилка № 1: Невідповідність шаблону та рядка.
Якщо рядок "01.06.2025 14:30", а шаблон "dd.MM.yyyy", парсинг завершиться помилкою. Шаблон має точно збігатися з рядком.

Помилка № 2: Переплутані символи шаблону.
MM — місяць, mm — хвилини. Якщо написати "dd.mm.yyyy", Java вирішить, що ви маєте на увазі хвилини, і видасть помилку. Для місяця завжди використовуйте велику літеру M.

Помилка № 3: Необроблені винятки під час парсингу.
Якщо не перехоплювати DateTimeParseException, програма може раптово завершитися у разі неправильного введення користувача. Завжди обробляйте такі помилки.

Помилка № 4: Не вказана локаль під час використання слів.
Якщо використовуєте шаблон із місяцем словами (MMMM), а локаль не вказана, Java може використати мову за замовчуванням (наприклад, англійську). Завжди задавайте потрібну локаль явно.

Помилка № 5: Використання старих класів (SimpleDateFormat, Date) у нових проєктах.
Пам’ятайте: у сучасному коді використовуйте лише java.time і DateTimeFormatter.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ