我有一个外部API,它返回我的时间长度,表示为Epoch开始以来的毫秒数。

使用旧风格的Java API,我将简单地从它构造一个Date

Date myDate = new Date(startDateLong)

在Java 8的LocalDate/LocalDateTime类中有什么等价的?

我感兴趣的是将long表示的时间点转换为当前本地时区中的LocalDate。


当前回答

除了时区和其他东西,一个非常简单的替代new Date(startDateLong)的方法可以是LocalDate。offepochday (startDateLong / 86400000L)

其他回答

我想我有更好的答案。

new Timestamp(longEpochTime).toLocalDateTime();

用long值替换now.getTime()。

//GET UTC time for current date
        Date now= new Date();
        //LocalDateTime utcDateTimeForCurrentDateTime = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDateTime();
        LocalDate localDate = Instant.ofEpochMilli(now.getTime()).atZone(ZoneId.of("UTC")).toLocalDate();
        DateTimeFormatter dTF2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
        System.out.println(" formats as " + dTF2.format(utcDateTimeForCurrentDateTime));

我已经测试了LocalDateTime的替代解决方案:

public static LocalDateTime increaseByMillis(final LocalDateTime ldt, final long millis)
    {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(ldt.toInstant(ZoneOffset.UTC).toEpochMilli()+millis), ZoneId.of(ZoneOffset.UTC.getId()));
    }

测试:

LocalDateTime test = LocalDateTime.now();
        LocalDateTime increased = MyUtilsAbc.increaseByMillis(test, 1000);

        Assert.assertEquals("Increase of LocalDateTime not working (anymore)!", test.toEpochSecond(ZoneOffset.UTC) +1, increased.toEpochSecond(ZoneOffset.UTC));

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

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

在一个特定的情况下,你的epoch seconds时间戳来自SQL或以某种方式与SQL相关,你可以像这样获得它:

long startDateLong = <...>

LocalDate theDate = new java.sql.Date(startDateLong).toLocalDate();