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

Yis*_*ang 13 java epoch milliseconds java-time java.time.instant

在Java中,我们可以有许多不同的方式来获得当前的时间戳,但哪一个建议: Instant.now().toEpochMilli()System.currentTimeMillis()

Ole*_*.V. 9

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

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

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

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

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

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

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

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

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

意见不一。有人会说您应该使用 java.time,现代日期和时间 API,来处理您的所有日期和时间工作。这将意味着Instant这里。联合国秘书长java.time通常是因为从Java 1.0和1.1的日期和时间类的好习惯(DateCalendarTimeZoneDateFormatSimpleDateFormat等)的设计不当,现在早已过时的,肯定不是任何我们应该再使用。在另一方面,我不知道有任何设计问题的System.curremtTimeMillis()特别(除了我上面提到的有关使用long毫秒数可言,这显然是内在都Instant.now().toEpochMilli()System.currentTimeMillis())。

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

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

类似问题

  • 我想补充一点,Instant.now() 的另一个优点是您可以使用 JMockit 之类的工具来模拟它。System.currentTimeMillis() 是本机方法,因此通常是不可模拟的。 (4认同)

Vin*_*ati 5

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

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

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

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


ype*_*per 5

不管怎样,我做了一个快速的非理想性能测试来比较这两种方法。

在我的系统(Ubuntu 20.04,OpenJDK 17.0.4)上,运行System.currentTimeMillis一千万次需要 cca 230ms,而运行Instant.now().toEpochMilli()一千万次需要 cca 370ms。

import java.time.Instant;

public class A { 
   public static void main(String[] args) {
       long a = 0;
       long start = System.currentTimeMillis();
       for (int i = 0; i < 10_000_000; i++) {
           //a += Instant.now().toEpochMilli();
           a += System.currentTimeMillis();
       }
       System.out.println(a);
       System.out.println(System.currentTimeMillis() - start);
   }   
}
Run Code Online (Sandbox Code Playgroud)