推荐哪个:Instant.now().toEpochMilli() or System.currentTimeMillis()

Which one is recommended: Instant.now().toEpochMilli() or System.currentTimeMillis()

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

根据我的理解,Instant.now().toEpochMilli() 更好,因为 Java-8 以后建议使用 Instant

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

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

因此,为了保持一致,请使用 Instant

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

自纪元以来您需要多少毫秒?

In Java, we can have many different ways to get the current timestamp,

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

Java 最初几年的许多方法,以及标准库中的许多方法,都采用了自纪元以来的 long 毫秒数作为参数。但是,今天我会认为这是过时的。看看你是否能找到——或创建——或更现代的方法,例如将 Instant 作为参数。转向面向对象,不要使用原语 long。它将使您的代码更清晰,更不言自明。

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

如果你需要自纪元

以来的毫秒数

假设您有充分的理由想要计算纪元以来的毫秒数,...

which one is recommended: Instant.now().toEpochMilli() or System.currentTimeMillis()[?]

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

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

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

类似问题

我想补充一点,System.nanoTime() 与精度无关,而与准确性有关。

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

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