1. DateTimeFormatter: що це таке і навіщо він потрібен
У реальних програмах дати рідко живуть лише всередині коду. Зазвичай їх потрібно:
- Перетворювати на рядок для виведення в консоль, на екран або у файл (наприклад, "01.06.2025 14:30").
- Парсити рядок, тобто перетворювати рядок, введений користувачем або отриманий із файлу, назад на об’єкт дати/часу.
Для цього в Java є потужний і зручний інструмент — клас java.time.format.DateTimeFormatter.
Можна сказати, що DateTimeFormatter — це перекладач між об’єктами часу (LocalDate, LocalDateTime, ZonedDateTime, Instant та ін.) та рядками. Він вміє:
- Перетворювати об’єкти дат/часу на рядки в потрібному форматі (format — форматування).
- Перетворювати рядки на об’єкти дат/часу (parse — парсинг).
2. Стандартні форматери: швидко й просто
Java дбайливо підготувала для вас набір стандартних форматерів, що охоплюють найпопулярніші формати ISO (міжнародні стандарти дати й часу).
Ось деякі з них:
| Форматер | Приклад рядка | Опис |
|---|---|---|
|
2025-06-01 | Лише дата (рік‑місяць‑день) |
|
14:30:00 | Лише час (години:хвилини:секунди) |
|
2025-06-01T14:30:00 | Дата й час без часового поясу |
|
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 — рік (yyyy — 2025)
- M — місяць (MM — 06)
- d — день (dd — 01)
- H — година (24‑годинний формат, HH — 14)
- m — хвилини (mm — 30)
- s — секунди (ss — 00)
Приклади шаблонів
| Шаблон | Приклад результату |
|---|---|
|
01.06.2025 |
|
2025/06/01 |
|
01.06.2025 14:30 |
|
2025-06-01 14:30:00 |
|
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. Форматування: перетворюємо дату/час у рядок
Загальна схема
- Створюємо потрібний об’єкт (LocalDate, LocalDateTime, ZonedDateTime тощо).
- Створюємо або обираємо потрібний форматер.
- Викликаємо в об’єкта метод 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. Парсинг: перетворюємо рядок у дату/час
Загальна схема
- Отримуємо рядок (наприклад, від користувача).
- Створюємо форматер із тим самим шаблоном, що й у рядку.
- Викликаємо статичний метод 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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ