如何在很长的纪元时间内以毫秒为单位创建Java 8 LocalDate?

问题

我有一个外部API返回我的日期为longs,表示自Epoch以来的毫秒数。

使用旧式Java API,我只需用它构造一个Date
Date myDate = new Date(startDateLong)
Java 8的LocalDate/LocalDateTime类中的等价物是什么?

我有兴趣将长度所代表的时间点转换为当前本地时区的aLocalDate


#1 热门回答(200 赞)

如果你有自Epoch以来的毫秒数并希望使用当前本地时区将它们转换为本地日期,则可以使用

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

但请记住,即使系统的默认时区可能会发生变化,因此相同的long值可能会在后续运行中产生不同的结果,即使在同一台机器上也是如此。

此外,请记住,与java.util.Date不同,LocalDate确实代表了日期,而不是日期和时间。

否则,你可以使用aLocalDateTime

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

#2 热门回答(19 赞)

你可以从Instant.ofEpochMilli(long)开始:

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

#3 热门回答(4 赞)

我想我有更好的答案。

new Timestamp(longEpochTime).toLocalDateTime();