我想知道是否有一种方法可以使用Java 8的新的LocalDate, LocalTime或LocalDateTime类来获取自1-1-1970 (epoch)以来的当前毫秒。

已知的方法如下:

long currentMilliseconds = new Date().getTime();

or

long currentMilliseconds = System.currentTimeMillis();

当前回答

我在不指定时区的情况下,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

给了

ldt 1424812121078 
ctm 1424812121281

正如你所看到的,数字是相同的,除了一个小的执行时间。

以防你不喜欢系统。currentTimeMillis,使用Instant.now().toEpochMilli()

其他回答

如果你有一个Java 8 Clock,那么你可以使用Clock .millis()(尽管它建议你使用Clock . Instant()来获得一个Java 8 Instant,因为它更准确)。

为什么要使用Java 8时钟?所以在你的DI框架中,你可以创建一个时钟bean:

@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

然后在你的测试中,你可以很容易地模拟它:

@MockBean private Clock clock;

或者你可以有一个不同的bean:

@Bean
public Clock getClock() {
    return Clock.fixed(instant, zone);
}

这有助于不可测量地断言日期和时间的测试。

  default LocalDateTime getDateFromLong(long timestamp) {
    try {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
    } catch (DateTimeException tdException) {
      //  throw new 
    }
}

default Long getLongFromDateTime(LocalDateTime dateTime) {
    return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}

日期和时间为字符串到长(毫秒):

String dateTimeString = "2020-12-12T14:34:18.000Z";

DateTimeFormatter formatter = DateTimeFormatter
                .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);

LocalDateTime localDateTime = LocalDateTime
        .parse(dateTimeString, formatter);

Long dateTimeMillis = localDateTime
        .atZone(ZoneId.systemDefault())
        .toInstant()
        .toEpochMilli();

你可以试试这个:

long diff = LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli();

这里有一些没有人提到的方法。但我看不出有什么理由它们不应该起作用。

对于LocalDate,可以使用toEpochDay()方法。它返回自01/01/1970以来的天数。这个数字可以很容易地转换为毫秒:

long dateInMillis = TimeUnit.DAYS.toMillis(myLocalDate.toEpochDays());

文档可以在这里找到。

对于LocalDateTime,可以使用toEpochSecond()方法。它返回自01/01/1970以来的秒数。这个数字也可以转换为毫秒:

long dateTimeInMillis = TimeUnit.SECONDS.toMillis(myLocalDateTime.toEpochSeconds());

这里有相关的文档。