如何从Java 8中的LocalDateTime获取毫秒
我想知道是否有一种方法可以使用Java 8的新LocalDate
, LocalTime
或LocalDateTime
类从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()
。