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

2022-08-31 04:42:03

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

已知的方法如下:

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

long currentMilliseconds = System.currentTimeMillis();

答案 1

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

如果你想找到自纪元以来的毫秒数那么请使用Anubian Noob所指出的那样。如果是这样,则没有理由使用任何新的java.time API来执行此操作。System.currentTimeMillis()

但是,也许您已经从某个地方获得了一个或类似的对象,并且您希望将其转换为自纪元以来的毫秒。这是不可能的,因为对象家族不知道它们所在的时区。因此,需要提供时区信息来查找相对于纪元的时间,该纪元以 UTC 为单位。LocalDateTimeLocalDateTime

假设你有一个这样的: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();

答案 2

我所做的是,所以我不指定时区是,

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

ldt 1424812121078 
ctm 1424812121281

如您所见,除了执行时间短之外,这些数字是相同的。

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