Конвертировать между java .time API и java .util.Date - PullRequest
1 голос
/ 02 апреля 2020

Начиная с Android Studio 4, отличный java.time API доступен для Android.

В моем проекте я хочу постепенно перейти от java.util.Date к новому API.

Как я могу конвертировать между двумя форматами?

1 Ответ

1 голос
/ 02 апреля 2020

Прежде всего, я хочу указать на существенные различия.

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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...