it-swarm.com.ru

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

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

Со старым стилем Java API я просто сконструировал бы из него Date

Date myDate = new Date(startDateLong)

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

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

138
Vihung

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

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

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

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

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

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

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

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

Я думаю, что у меня есть лучший ответ. 

new Timestamp(longEpochTime).toLocalDateTime();
8
Abhijeet

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

3
Michael Piefel

В конкретном случае, когда ваша метка времени Epoch-ы происходит от SQL или как-то связана с SQL, вы можете получить ее следующим образом:

long startDateLong = <...>

LocalDate theDate = new Java.sql.Date(startDateLong).toLocalDate();
0
M. Prokhorov