Как я могу создать Java 8 LocalDate из длинного периода Epoch в миллисекундах?

У меня есть внешний API, возвращающий мне даты как long s, представленные как миллисекунды с эпохи.

С помощью Java API старого стиля я бы просто построил Date из него с помощью

Date myDate = new Date(startDateLong)

Что такое эквивалент в Java 8 LocalDate/LocalDateTime classes?

Я заинтересован в преобразовании точки во времени, представленной длинной в LocalDate в моем текущем локальном часовом поясе.

Ответ 1

Если у вас есть миллисекунды с эпохи и хотите преобразовать их в локальную дату с использованием текущего локального часового пояса, вы можете использовать

LocalDate date =
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

но имейте в виду, что даже временная зона по умолчанию для систем может меняться, поэтому одно и то же значение long может давать разные результаты в последующих прогонах даже на одном компьютере.

Кроме того, имейте в виду, что LocalDate, в отличие от java.util.Date, действительно представляет дату, а не дату и время.

В противном случае вы можете использовать LocalDateTime:

LocalDateTime date =
    LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());

Ответ 2

Вы можете начать с Instant.ofEpochMilli(long):

LocalDate date =
  Instant.ofEpochMilli(startDateLong)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();

Ответ 3

Временные метки и прочее, очень простая альтернатива new Date(startDateLong) может быть LocalDate.ofEpochDay(startDateLong / 86400000L)