我想知道是否有一种方法可以使用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开始,你可以调用Java .time. instant . toepochmilli()。

例如,调用

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

得到的结果和

final long currentTimeJava1 = System.currentTimeMillis();

你也可以使用java.sql.Timestamp来获取毫秒数。

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);

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

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

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

文档可以在这里找到。

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

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

这里有相关的文档。

对于LocalDateTime,我这样做:

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

要避免ZoneId,您可以这样做:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

得到0作为值,这是对的!