Короткий ответ
Главная особенность нового Date and Time API (пакет java.time, Java 8) — неизменяемость: все классы, такие как LocalDate, LocalTime, LocalDateTime, immutable, а значит, потокобезопасны. API построен по образцу библиотеки Joda-Time и на основе календарной системы ISO-8601. Он разделяет понятия даты, времени и зоны, предоставляет фабричные методы и fluent-интерфейс для вычислений с датами.
Как это работает подробнее
API разделяет разные понятия времени: LocalDate — дата без времени и зоны; LocalTime — время без даты и зоны; LocalDateTime — дата и время без зоны; ZonedDateTime и OffsetDateTime — с зоной или смещением; Instant — момент на временной шкале; Duration и Period — промежутки времени.
Методы сдвига (plusDays(), minusMonths(), plus(Period)) возвращают новый экземпляр, не меняя исходный, — отсюда неизменяемость и потокобезопасность. Вместо конструкторов с запутанными параметрами используются фабричные методы: now(), of(), parse().
- Форматирование и разбор выполняет DateTimeFormatter, который потокобезопасен, в отличие от SimpleDateFormat.
- Старые классы получили методы конвертации (Date.toInstant(), Date.from()) для плавной миграции.
- ZonedDateTime и ZoneId корректно учитывают переход на летнее и зимнее время.
Пример кода
import java.time.*;
import java.time.format.DateTimeFormatter;
public class DateTimeExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusWeeks(1); // новый объект
ZonedDateTime msk = ZonedDateTime.now(
ZoneId.of("Europe/Moscow"));
Instant instant = Instant.now();
String formatted = today.format(
DateTimeFormatter.ofPattern("dd.MM.yyyy"));
System.out.println(formatted);
}
}Что использовать на практике
- Для даты и времени без зоны используйте LocalDate, LocalTime, LocalDateTime.
- Для момента с зоной применяйте ZonedDateTime, для timestamp — Instant, для промежутков — Duration и Period.
- Для форматирования используйте DateTimeFormatter, а не небезопасный SimpleDateFormat.
Подводные камни
- Классы immutable: методы сдвига возвращают новый объект — не игнорируйте результат.
- LocalDateTime не содержит зоны и не учитывает переход на летнее время — для этого нужен ZonedDateTime.
- SimpleDateFormat не потокобезопасен; в многопоточном коде используйте DateTimeFormatter.
Как отвечать на собеседовании
- Назовите главную особенность — неизменяемость и потокобезопасность → перечислите классы для разных понятий времени → покажите фабричные методы и fluent-сдвиги → упомяните DateTimeFormatter → сравните со старыми Date, Calendar и SimpleDateFormat.