在 Java 中,我们可以有很多不同的方法来获取当前时间戳,但是推荐使用哪一种:
Instant.now().toEpochMilli()
或者System.currentTimeMillis()
3 回答
两者都很好。除了少数目的外,两者都不推荐。
自纪元以来,您需要几毫秒?
在 Java 中,我们可以有很多不同的方式来获取当前时间戳,
对于当前时间戳,只需使用Instant.now()
. 无需转换为毫秒。
Java 最初几年中的许多方法,也包括标准库中的许多方法,long
自 epoch 以来花费了数毫秒作为参数。但是,今天我会认为那是过时的。看看你是否能找到——或创建——或者更现代的方法,例如使用Instant
as 参数。面向对象,不要使用原始long
. 它将使您的代码更清晰,更不言自明。
正如 Eliott Frisch 在评论中所说,如果这是为了测量经过的时间,您可能更喜欢更高的分辨率System.nanoTime()
。
如果您确实需要自纪元以来的毫秒数
假设您有充分的理由想要自纪元以来的毫秒数,……</p>
推荐哪一个:
Instant.now().toEpochMilli()
或System.currentTimeMillis()
[?]
意见不一。有人会说您应该使用现代日期和时间 API java.time 来处理所有日期和时间工作。这意味着Instant
这里。Unsg java.time 通常是一个好习惯,因为 Java 1.0 和 1.1 中的日期和时间类(Date
、Calendar
、TimeZone
、和其他)设计不佳DateFormat
,SimpleDateFormat
现在早已过时,当然不应该再使用了。另一方面,我不知道System.curremtTimeMillis()
特别是任何设计问题(除了我上面提到的关于使用long
毫秒计数的问题,这显然是两者固有的Instant.now().toEpochMilli()
)System.currentTimeMillis()
。
如果两者之间存在细微的性能差异,我很难想象这会产生什么影响。
选择您认为在您的上下文中更具可读性且不那么令人惊讶的选项。
类似问题
根据我的理解Instant.now().toEpochMilli()
,推荐使用 Java-8 之后的使用效果更好Instant
。
此外,它基于时间轴工作,即时表示该时间轴上的特定时刻。
在java.lang.System.currentTimeMillis()
方法的情况下,它以毫秒为单位返回当前时间。值的粒度取决于底层操作系统,可能更大。
因此,要完全一致,请使用Instant
.
我想补充一点,这System.nanoTime()
不是关于精度,而是更多关于准确性。
System.currentTimeMillis()
它基于系统时钟,大多数情况下,它基于计算机内部的石英时钟。它不准确,而且会漂移。(虚拟机更糟糕,因为你没有物理时钟并且必须与主机同步)当你的计算机将这个石英时钟与全局时钟同步时,你甚至可能会观察到你的时钟向后/向前跳跃,因为你的本地时钟太快或慢。
另一方面,System.nanoTime()
是基于单调时钟。这个时钟与我们人类说话的实际时间无关。它只会以恒定的速度前进。它不会像石英钟那样漂移,也不需要同步。这就是为什么它非常适合测量经过。