19

在 Java 中,我们可以有很多不同的方法来获取当前时间戳,但是推荐使用哪一种: Instant.now().toEpochMilli()或者System.currentTimeMillis()

4

3 回答 3

10

两者都很好。除了少数目的外,两者都不推荐。

自纪元以来,您需要几毫秒?

在 Java 中,我们可以有很多不同的方式来获取当前时间戳,

对于当前时间戳,只需使用Instant.now(). 无需转换为毫秒。

Java 最初几年中的许多方法,也包括标准库中的许多方法,long自 epoch 以来花费了数毫秒作为参数。但是,今天我会认为那是过时的。看看你是否能找到——或创建——或者更现代的方法,例如使用Instantas 参数。面向对象,不要使用原始long. 它将使您的代码更清晰,更不言自明。

正如 Eliott Frisch 在评论中所说,如果这是为了测量经过的时间,您可能更喜欢更高的分辨率System.nanoTime()

如果您确实需要自纪元以来的毫秒数

假设您有充分的理由想要自纪元以来的毫秒数,……</p>

推荐哪一个:Instant.now().toEpochMilli()System.currentTimeMillis()[?]

意见不一。有人会说您应该使用现代日期和时间 API java.time 来处理所有日期和时间工作。这意味着Instant这里。Unsg java.time 通常是一个好习惯,因为 Java 1.0 和 1.1 中的日期和时间类(DateCalendarTimeZone、和其他)设计不佳DateFormatSimpleDateFormat现在早已过时,当然不应该再使用了。另一方面,我不知道System.curremtTimeMillis()特别是任何设计问题(除了我上面提到的关于使用long毫秒计数的问题,这显然是两者固有的Instant.now().toEpochMilli()System.currentTimeMillis()

如果两者之间存在细微的性能差异,我很难想象这会产生什么影响。

选择您认为在您的上下文中更具可读性且不那么令人惊讶的选项。

类似问题

于 2019-11-05T19:31:07.527 回答
4

根据我的理解Instant.now().toEpochMilli(),推荐使用 Java-8 之后的使用效果更好Instant

此外,它基于时间轴工作,即时表示该时间轴上的特定时刻。

java.lang.System.currentTimeMillis()方法的情况下,它以毫秒为单位返回当前时间。值的粒度取决于底层操作系统,可能更大。

因此,要完全一致,请使用Instant.

于 2019-11-05T06:35:46.227 回答
2

我想补充一点,这System.nanoTime()不是关于精度,而是更多关于准确性。

System.currentTimeMillis()它基于系统时钟,大多数情况下,它基于计算机内部的石英时钟。它不准确,而且会漂移。(虚拟机更糟糕,因为你没有物理时钟并且必须与主机同步)当你的计算机将这个石英时钟与全局时钟同步时,你甚至可能会观察到你的时钟向后/向前跳跃,因为你的本地时钟太快或慢。

另一方面,System.nanoTime()是基于单调时钟。这个时钟与我们人类说话的实际时间无关。它只会以恒定的速度前进。它不会像石英钟那样漂移,也不需要同步。这就是为什么它非常适合测量经过。

于 2020-05-22T03:48:39.797 回答