JavaRush /Курси /JAVA 25 SELF /LocalDate, LocalTime, LocalDateTime

LocalDate, LocalTime, LocalDateTime

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

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).

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