如何从Java 8中的LocalDateTime获取毫秒

我想知道是否有一种方法可以使用Java 8的新LocalDateLocalTimeLocalDateTime类从1-1-1970(epoch)获取当前毫秒数。

已知的方式如下:

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

要么

 long currentMilliseconds = System.currentTimeMillis(); 

我不完全确定“当前毫秒”是什么意思,但是我认为这是“纪元”以来的毫秒数,即1970年1月1日午夜UTC。

如果你想从现在开始的时代中查找毫秒数那么使用System.currentTimeMillis()作为Anubian Noob指出的 。 如果是这样,没有理由使用任何新的java.time API来做到这一点。

然而,也许你已经有了一个LocalDateTime或类似的对象,你想把它从时代转换成毫秒。 这是不可能的,因为LocalDateTime系列的对象没有他们所在的时区的概念。因此需要提供时区信息来查找相对于UTC时代的相对时间。

假设你有这样的LocalDateTime

 LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16); 

您需要应用时区信息,给ZonedDateTime 。 我和洛杉矶在同一时区,所以我会这样做:

 ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles")); 

当然,这是对时区的假设。 例如,如果本地时间恰好指定夏令时(夏令时)转换附近的时间,则会出现边缘情况。 我们把这些放在一边,但是你应该知道这些情况是存在的。

无论如何,如果你能得到一个有效的ZonedDateTime ,你可以把它转换成自纪元以来的毫秒数,如下所示:

 long millis = zdt.toInstant().toEpochMilli(); 

我这样做,我没有指定一个时区是,

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

 ldt 1424812121078 ctm 1424812121281 

以防万一你不喜欢System.current ….,使用Instant.now().toEpochMilli()

为了避免ZoneId,你可以这样做:

 LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0); System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli()); 

获得0作为价值,这是正确的!

要获取当前时间(自时代起),请使用System.currentTimeMillis()