Прежде всего, я хочу указать на существенные различия.
java .time
API java .time отлично работает, будучи явным о различных понятиях времени, например, если вы хотите представить определенный момент времени или Duration
. В первом случае вы можете выбрать, хотите ли вы представлять дату, время или и то и другое, и хотите ли вы указывать часовой пояс или нет, например,
LocalDate
(дата, нет время, без часового пояса) LocalDateTime
(дата, время, без часового пояса) ZonedDateTime
(дата, время, часовой пояс)
Instant
представляет метку времени (наносекунды с 01.01.1970 в UT C). Так что это машинное представление времени, но также и строительный блок для других классов.
Чтобы увидеть все классы, см. Документацию java .time API .
java .util.Date
Методы Date
предполагают, что он представляет дату и время. Внутри он хранит только временную метку (миллисекунды с 01.01.1970 UT C) и без часового пояса.
Рекомендуемый способ его создания - использование класса Calendar
с поддержкой часовых поясов. Однако сам Date
создается неявно с использованием часового пояса, на котором работает компьютер. Вызов toString()
отформатированного вывода может показывать часовой пояс, но он извлекается извне из Calendar
экземпляра, что приводит к путанице Date
будет хранить часовой пояс.
В целом, API плохо спроектирован и может сбивать с толку. java.time
намного лучше, и его следует использовать, если доступно.
Адаптер для устаревшего кода
Как тогда соединяются два API? -> через Instant
.
В java 8 java.util.Date
было расширено двумя способами:
public static Date from(Instant instant)
public Instant toInstant()
Это встроенный мост между обоими API!
Мы можем встроить дополнительные функции адаптера. Вот пример (в Kotlin) с преобразованием для классов LocalDate
и LocalDateTime
:
/**
* java.util.Date has no explicit time zone but implicitly uses the system's time zone
*/
private val dateZoneId: ZoneId = ZoneId.systemDefault()
fun Date.toLocalDate(): LocalDate = toInstant().atZone(dateZoneId).toLocalDate()
fun LocalDate.toDate(): Date = Date.from(atStartOfDay(dateZoneId).toInstant())
fun Date.toLocalDateTime(): LocalDateTime = toInstant().atZone(dateZoneId).toLocalDateTime()
fun LocalDateTime.toDate(): Date = Date.from(atZone(dateZoneId).toInstant())