У меня есть внешний API, который возвращает мне даты как long
s, представленные в миллисекундах с начала эпохи.
Со старым стилем Java API я бы просто сконструировал Date
из него
Date myDate = new Date(startDateLong)
Что эквивалентно в Java 8's LocalDate
/ LocalDateTime
classes?
Я заинтересован в превращении момента времени , представленный long
к LocalDate
в моей текущей локальной временной зоне.
java.util.Date
самом деле это никогда не было свидание,LocalDate
а момент времени.java.util.Date
вLocalDate
File.lastModified()
(эпоха миллис) вLocalDate(Time)
.Ответы:
Если у вас есть миллисекунды с начала эпохи и вы хотите преобразовать их в местную дату, используя текущий часовой пояс, вы можете использовать
но имейте в виду, что даже часовой пояс системы может измениться, поэтому одно и то же
long
значение может привести к разным результатам при последующих запусках даже на одном компьютере.Кроме того, имейте в виду, что
LocalDate
, в отличие отjava.util.Date
, действительно представляет собой дату, а не дату и время.В противном случае вы можете использовать
LocalDateTime
:источник
LocalDateTime.ofEpochSecond(…)
требует фактическогоZoneOffset
, ноZoneId.systemDefault()
возвращаетZoneId
.ZoneId
Можно сопоставить с различными смещениями, в зависимости от момента времени , вы имеете в виду. Вот чтоLocalDateTime.ofInstant
делает для вас, конвертируя указанное вZoneId
соответствии с предоставленнымInstant
.LocalDate
илиLocalDateTime
. Вы можете указать любой часовой пояс, который вы хотите, при условии, что он совместим с последующим использованием этих объектов результатов. Подумайте, что происходит, когда вы имеете дело с несколькими объектами, созданными разными методами. Типичные случаи использования для локальной даты или даты и времени включают часовой пояс системы по умолчанию, например,LocalDateTime.now()
≈LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
…Вы можете начать с Instant.ofEpochMilli (long) :
источник
Я думаю, что у меня есть лучший ответ.
источник
Timestamp
Класс плохо разработаны и давно устарели. В вашем коде будет использоваться настройка часового пояса JVM, но, поскольку этот параметр может быть изменен другой частью вашей программы или другой программой, запущенной в той же JVM, мы не можем быть полностью уверены, что это такое.Часовые пояса и прочее в стороне, очень простая альтернатива
new Date(startDateLong)
могут бытьLocalDate.ofEpochDay(startDateLong / 86400000L)
источник
java.time
не включает,DateTimeConstants
как Йода.java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
замените now.getTime () вашим длинным значением.
источник
В конкретном случае, когда ваша отметка времени в секундах происходит от SQL или как-то связана с SQL, вы можете получить ее следующим образом:
источник
LocalDate
изepoch-millis
», и я покажу, как, используяjava.sql.Date
для краткости. Этот подход имеет смысл в коде, который уже имеет дело с JDBC в некотором объеме, и он работает просто отлично. Если вы все еще не уверены, объясните, как это не связано с первоначальным вопросом.java.sql.Date
подход является одним из самых коротких из доступных, с точки зрения кода, и я бы сказал, что это не так уж и полезно идтиInstant
со всеми промежуточными временными объектами, когда конечный результат одинаков.