推荐哪个: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
, DateFormat
、SimpleDateFormat
和其他)设计不佳,现在早已过时,当然不应该再使用了。另一方面,我不知道 System.curremtTimeMillis()
有任何设计问题(除了我上面提到的使用 long
毫秒计数,这显然是 Instant.now().toEpochMilli()
和 System.currentTimeMillis()
).
如果两者之间存在细微的性能差异,我很难想象这会产生什么影响。
选择您认为在您的上下文中更具可读性且不那么令人惊讶的选项。
类似问题
我想补充一点,System.nanoTime()
与精度无关,而与准确性有关。
System.currentTimeMillis()
基于系统时钟,在大多数情况下,系统时钟基于计算机内部的石英时钟。它不准确并且会漂移。 (VM 更糟糕,因为您没有物理时钟并且必须与主机同步)当您的计算机将此石英时钟与全球时钟同步时,您甚至可能会观察到您的时钟跳跃 backward/forward 因为您的本地时钟太快或太慢。
另一方面,System.nanoTime()
基于单调时钟。这个时钟与我们人类说话的实际时间无关。它只会以恒定的速度向前移动。它不像石英钟那样漂移,也不需要同步。这就是为什么它非常适合测量经过的时间。
在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()
orSystem.currentTimeMillis()
[?]
意见不一。有人会说您应该使用 java.time,现代日期和时间 API,用于所有日期和时间工作。这意味着 Instant
在这里。 Unsg java.time 通常是一个好习惯,因为日期和时间 类 来自 Java 1.0 和 1.1 (Date
, Calendar
, TimeZone
, DateFormat
、SimpleDateFormat
和其他)设计不佳,现在早已过时,当然不应该再使用了。另一方面,我不知道 System.curremtTimeMillis()
有任何设计问题(除了我上面提到的使用 long
毫秒计数,这显然是 Instant.now().toEpochMilli()
和 System.currentTimeMillis()
).
如果两者之间存在细微的性能差异,我很难想象这会产生什么影响。
选择您认为在您的上下文中更具可读性且不那么令人惊讶的选项。
类似问题
我想补充一点,System.nanoTime()
与精度无关,而与准确性有关。
System.currentTimeMillis()
基于系统时钟,在大多数情况下,系统时钟基于计算机内部的石英时钟。它不准确并且会漂移。 (VM 更糟糕,因为您没有物理时钟并且必须与主机同步)当您的计算机将此石英时钟与全球时钟同步时,您甚至可能会观察到您的时钟跳跃 backward/forward 因为您的本地时钟太快或太慢。
另一方面,System.nanoTime()
基于单调时钟。这个时钟与我们人类说话的实际时间无关。它只会以恒定的速度向前移动。它不像石英钟那样漂移,也不需要同步。这就是为什么它非常适合测量经过的时间。