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

已知的方法如下:

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

or

long currentMilliseconds = System.currentTimeMillis();

当前回答

从Java 8开始,你可以调用Java .time. instant . toepochmilli()。

例如,调用

final long currentTimeJava8 = Instant.now().toEpochMilli();

得到的结果和

final long currentTimeJava1 = System.currentTimeMillis();

其他回答

要获得以毫秒为单位的当前时间(从epoch开始),请使用System.currentTimeMillis()。

我认为这个更简单:

ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());
Assert.assertEquals(System.currentTimeMillis(), zdt.toInstant().toEpochMilli());

获取类似System.currentTimeMillis()(从UTC)的millis。

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

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();

如果你有一个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);
}

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

对于LocalDateTime,我这样做:

LocalDateTime.of(2021,3,18,7,17,24,341000000)
    .toInstant(OffsetDateTime.now().getOffset())
    .toEpochMilli()