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

新手上路,请多包涵

我想知道是否有办法使用新的 LocalDate , LocalTimeLocalDateTime --- 或 —b9b6b08c9933470d8170c 类来获取当前毫秒数8.

已知的方法如下:

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

或者

long currentMilliseconds = System.currentTimeMillis();

原文由 Georgios Syngouroglou 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

我不完全确定你所说的“当前毫秒数”是什么意思,但我假设它是自“纪元”以来的毫秒数,即 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();

原文由 Stuart Marks 发布,翻译遵循 CC BY-SA 3.0 许可协议

我没有指定时区的做法是,

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

原文由 brian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题