【问题标题】:Which one is recommended: Instant.now().toEpochMilli() or System.currentTimeMillis()推荐哪一个: Instant.now().toEpochMilli() 或 System.currentTimeMillis()
【发布时间】:2020-03-01 11:47:39
【问题描述】:

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

【问题讨论】:

  • 定义更好?性能更高?我敢打赌他们的表现是一样的。更具可读性?那只是意见。但是,我认为两者都比Calendar.getInstance().getTimeInMillis()
  • 在性能方面,System.currentTimeMillis() 应该更快,因为开销更少(不创建对象)。在精度方面,当支持微秒级分辨率时,Instant-方法在某些平台上可能会更好。
  • @ElliottFrisch 我已经更改了措辞:-D
  • 真正的问题是你为什么要得到时间戳?如果您正在计时,那么System.nanoTime() 可能是您要走的路(如果您想要precision)。我可能寻找更高层次的抽象;喜欢StopWatch
  • @MenoHochschild 微秒分辨率有什么关系,当两个构造都将截断到毫秒时?

标签: java epoch java-time milliseconds java.time.instant


【解决方案1】:

两者都很好。除非出于少数目的,否则都不推荐。

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

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

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

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

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

如果您确实需要从纪元开始的毫秒数

假设您有充分的理由想要从纪元开始计算毫秒数,……

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

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

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

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

类似问题

【讨论】:

  • 我要补充一下 Instant.now() 的另一个优点是您可以使用 JMockit 之类的工具来模拟它。 System.currentTimeMillis() 是本机方法,因此通常不可模拟。
【解决方案2】:

据我了解,Instant.now().toEpochMilli() 更好,因为已推荐使用 Java-8 以后的 Instant

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 不是所有的时钟都会漂移吗?什么应该阻止System.nanoTime() 这样做?
    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2011-06-12
    • 2019-02-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多