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 лекция
Недоступна
Корректировка времени секретной миссии 🚀
Корректировка времени секретной миссии 🚀
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grrbrr7 Уровень 21
16 ноября 2025
"Вы старше, чем только что родились!"
Dthmth Уровень 11
26 октября 2025
Кажется нам забыли рассказать, что мы развиваем учебное консольное приложение)