1. LocalDate: дата без часу та часового поясу
LocalDate — це просто дата. Без часу, без часового поясу, без зайвого клопоту. Як сторінка в календарі: 2025-06-01 — і все. Якщо вам неважливо, коли саме настає «північ» у різних містах, а потрібно лише «1 червня 2025 року» — використовуйте LocalDate.
Як створити LocalDate?
Способів кілька, і всі вони прості та зручні.
Поточна дата
import java.time.LocalDate;
LocalDate today = LocalDate.now();
System.out.println(today); // Наприклад, 2025-06-01
Конкретна дата
LocalDate birthday = LocalDate.of(1990, 12, 15);
System.out.println(birthday); // 1990-12-15
Можна використовувати числа для року, місяця й дня. Місяць — це число від 1 до 12 (січень — 1, грудень — 12).
Парсинг із рядка
LocalDate parsedDate = LocalDate.parse("2025-06-01");
System.out.println(parsedDate); // 2025-06-01
Рядок має бути у форматі yyyy-MM-dd. Якщо формат не збігається, виникне виняток.
Отримання компонентів дати
У LocalDate є методи, що повертають окремі частини дати:
int year = today.getYear(); // 2025
int month = today.getMonthValue(); // 6 (червень)
int day = today.getDayOfMonth(); // 1
System.out.println("Рік: " + year + ", місяць: " + month + ", день: " + day);
Якщо ви хочете дізнатися місяць словами, використайте метод getMonth():
System.out.println(today.getMonth()); // JUNE
А якщо потрібен день тижня — використайте метод getDayOfWeek():
System.out.println(today.getDayOfWeek()); // SATURDAY
Практичний приклад
Продовжімо вдосконалювати ваш навчальний консольний застосунок: тепер він може вітати користувача з днем народження.
import java.time.LocalDate;
public class BirthdayApp {
public static void main(String[] args) {
LocalDate birthday = LocalDate.of(2000, 2, 29);
System.out.println("Дата народження: " + birthday);
System.out.println("День тижня народження: " + birthday.getDayOfWeek());
}
}
2. LocalTime: час без дати й часового поясу
LocalTime — це просто час. Години, хвилини, секунди і навіть наносекунди. Але без дати! Якщо треба зберігати, наприклад, «час відкриття магазину» або «час початку зустрічі» без привʼязки до дати — це ваш клас.
Як створити LocalTime?
Поточний час
import java.time.LocalTime;
LocalTime now = LocalTime.now();
System.out.println(now); // Наприклад, 14:37:12.123456789
Конкретний час
LocalTime lunchTime = LocalTime.of(13, 30); // 13:30:00
System.out.println(lunchTime);
Можна додати секунди й наносекунди:
LocalTime precise = LocalTime.of(8, 15, 30, 123_000_000); // 08:15:30.123
System.out.println(precise);
Парсинг із рядка
LocalTime parsedTime = LocalTime.parse("14:30:00");
System.out.println(parsedTime); // 14:30
Отримання компонентів часу
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
System.out.println("Години: " + hour + ", хвилини: " + minute + ", секунди: " + second);
Практичний приклад
Додаймо до нашого застосунку годинник:
import java.time.LocalTime;
public class ClockApp {
public static void main(String[] args) {
LocalTime current = LocalTime.now();
System.out.println("Зараз: " + current);
System.out.println("Година: " + current.getHour());
System.out.println("Хвилина: " + current.getMinute());
}
}
3. LocalDateTime: дата й час без часового поясу
LocalDateTime — це поєднання дати й часу, але все ще без часового поясу. Наприклад, «2025-06-01 14:30:00». Це зручно, коли ви хочете зберегти момент часу, але вам неважливо, де на планеті його читатимуть.
Як створити LocalDateTime?
Поточні дата й час
import java.time.LocalDateTime;
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // Наприклад, 2025-06-01T14:30:15.123456789
Конкретні дата й час
LocalDateTime meeting = LocalDateTime.of(2025, 6, 1, 14, 30);
System.out.println(meeting); // 2025-06-01T14:30
Можна додати секунди й наносекунди:
LocalDateTime preciseMeeting = LocalDateTime.of(2025, 6, 1, 14, 30, 45, 123_000_000);
System.out.println(preciseMeeting); // 2025-06-01T14:30:45.123
Парсинг із рядка
LocalDateTime parsed = LocalDateTime.parse("2025-06-01T14:30:00");
System.out.println(parsed); // 2025-06-01T14:30
Зверніть увагу: літера T відокремлює дату від часу за стандартом ISO.
Отримання компонентів
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
System.out.println("Дата: " + year + "-" + month + "-" + day + " Час: " + hour + ":" + minute);
4. Типові операції з датою й часом
Тепер, коли ми вміємо створювати обʼєкти дати й часу, навчімося робити з ними щось корисне.
Додавання та віднімання
Усі три класи (LocalDate, LocalTime, LocalDateTime) незмінні. Це означає, що методи типу plusDays() або minusMonths() повертають новий обʼєкт, не змінюючи вихідний.
LocalDate
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalDate lastMonth = today.minusMonths(1);
System.out.println("Сьогодні: " + today);
System.out.println("Завтра: " + tomorrow);
System.out.println("Місяць тому: " + lastMonth);
LocalTime
LocalTime now = LocalTime.now();
LocalTime inTenMinutes = now.plusMinutes(10);
System.out.println("Зараз: " + now);
System.out.println("За 10 хвилин: " + inTenMinutes);
LocalDateTime
LocalDateTime start = LocalDateTime.of(2025, 6, 1, 14, 0);
LocalDateTime end = start.plusHours(2).minusMinutes(15);
System.out.println("Початок: " + start);
System.out.println("Кінець: " + end);
Порівняння дат і часу
У всіх класах є методи isBefore(), isAfter(), isEqual():
LocalDate birthday = LocalDate.of(2000, 2, 29);
LocalDate today = LocalDate.now();
if (today.isAfter(birthday)) {
System.out.println("Ви старші, ніж щойно народилися!");
}
LocalTime morning = LocalTime.of(8, 0);
LocalTime now = LocalTime.now();
if (now.isBefore(morning)) {
System.out.println("Ще рано вставати...");
} else {
System.out.println("Пора прокидатися!");
}
Отримання поточної дати й часу
Як ми вже бачили, методи now() повертають поточні значення:
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
5. Практика: приклади й задачі
Приклад 1: День тижня для будь-якої дати
import java.time.LocalDate;
public class DayOfWeekApp {
public static void main(String[] args) {
LocalDate anyDate = LocalDate.of(2025, 12, 31);
System.out.println("31 грудня 2025 року — це " + anyDate.getDayOfWeek());
}
}
Приклад 2: Скільки днів до Нового року?
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class DaysToNewYear {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate newYear = LocalDate.of(today.getYear() + 1, 1, 1);
long daysLeft = ChronoUnit.DAYS.between(today, newYear);
System.out.println("До Нового року залишилося " + daysLeft + " днів!");
}
}
Приклад 3: Перевірка, чи є рік високосним
import java.time.LocalDate;
public class LeapYearCheck {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2025, 1, 1);
if (date.isLeapYear()) {
System.out.println(date.getYear() + " — високосний рік!");
} else {
System.out.println(date.getYear() + " — звичайний рік.");
}
}
}
Приклад 4: Різниця між двома моментами часу
import java.time.LocalTime;
import java.time.Duration;
public class TimeDifference {
public static void main(String[] args) {
LocalTime start = LocalTime.of(9, 0);
LocalTime end = LocalTime.of(17, 30);
Duration duration = Duration.between(start, end);
System.out.println("Робочий день триває " + duration.toHours() + " годин " +
(duration.toMinutes() % 60) + " хвилин.");
}
}
6. Типові помилки
Помилка № 1: Плутають LocalDateTime і ZonedDateTime.
LocalDateTime не містить інформації про часовий пояс! Якщо ви зберігаєте розклад рейсів між країнами або події, які відбуваються у різних часових поясах, — використовуйте ZonedDateTime, інакше можна отримати неочікувані результати під час перенесення даних між системами.
Помилка № 2: Використовують неправильний формат рядка для парсингу.
Наприклад, намагаються розібрати 01.06.2025 через LocalDate.parse(). За замовчуванням очікується формат 2025-06-01. Для інших форматів потрібен спеціальний DateTimeFormatter (про це у наступній лекції!).
Помилка № 3: Думають, що методи типу plusDays() змінюють обʼєкт.
Ні! Усі обʼєкти незмінні. Метод повертає новий обʼєкт, а старий залишається без змін.
Помилка № 4: Використовують LocalTime для збереження абсолютного часу.
LocalTime — лише для локального часу доби. Якщо ви хочете зберегти «момент у часі», використовуйте Instant або ZonedDateTime.
Помилка № 5: Забувають про нумерацію місяців (1 — січень, 12 — грудень).
У LocalDate.of(year, month, day) відлік місяців ведеться від 1 (а не від 0, як у деяких інших мовах або старих API).
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ