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).
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ