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

1
Задача
JAVA 25 SELF, 13 уровень, 2 лекция
Недоступна
Волшебные часы: показ точного времени 🕰️
Волшебные часы: показ точного времени 🕰️
1
Задача
JAVA 25 SELF, 13 уровень, 2 лекция
Недоступна
Астрологический прогноз: день рождения и день недели 🌟
Астрологический прогноз: день рождения и день недели 🌟
1
Задача
JAVA 25 SELF, 13 уровень, 2 лекция
Недоступна
Расписание встреч: кто раньше? ⏰
Расписание встреч: кто раньше? ⏰
1
Задача
JAVA 25 SELF, 13 уровень, 2 лекция
Недоступна
Корректировка времени секретной миссии 🚀
Корректировка времени секретной миссии 🚀
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grrbrr7 Уровень 44
16 ноября 2025
"Вы старше, чем только что родились!"
Dthmth Уровень 11
26 октября 2025
Кажется нам забыли рассказать, что мы развиваем учебное консольное приложение)
Gans Electro Уровень 28
11 июня 2026
На самом деле не консольных приложений меньшинство. Все приложения консольные, пока не сделают UI. И даже если будет UI то консольная часть все равно работает под капотом
10 июля 2026
Откуда такая информация? У REST-сервиса нет UI, но это не консольное приложение.