Java 建议使用哪一种:Instant.now().toEpochMilli()或System.currentTimeMillis()

Java 建议使用哪一种:Instant.now().toEpochMilli()或System.currentTimeMillis(),java,epoch,java-time,milliseconds,java.time.instant,Java,Epoch,Java Time,Milliseconds,Java.time.instant,在Java中,我们可以有许多不同的方法来获取当前时间戳,但建议使用哪种方法: Instant.now().toEpochMilli()或System.currentTimeMillis()根据我的理解Instant.now().toEpochMilli()更好,因为Java-8以后推荐使用Instant 此外,它基于时间轴工作,瞬间表示该时间轴上的特定时刻 如果使用java.lang.System.currentTimeMillis()方法,它将以毫秒为单位返回当前时间。值的粒度取决于底层操作系

在Java中,我们可以有许多不同的方法来获取当前时间戳,但建议使用哪种方法:
Instant.now().toEpochMilli()
System.currentTimeMillis()
根据我的理解
Instant.now().toEpochMilli()
更好,因为Java-8以后推荐使用
Instant

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

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


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

两者都可以。除少数目的外,不建议使用这两种方法

从纪元开始,你需要毫秒做什么? 在Java中,我们可以有许多不同的方法来获取当前时间戳

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

Java最初几年的许多方法,也包括标准库中的许多方法,都以自epoch以来的
long
毫秒数作为参数。然而,今天我会认为这是过时的。看看你是否能找到——或者创建——或者更现代的方法,比如把
Instant
作为参数。使用面向对象,不要使用原语
long
。它将使您的代码更清晰,更易于解释

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

如果您确实需要从纪元开始的毫秒数 假设您有充分的理由希望从纪元开始计算毫秒数

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

众说纷纭。有人会说,您应该使用java.time(现代日期和时间API)来完成所有的日期和时间工作。这意味着这里的
Instant
。Unsg java.time通常是一个好习惯,因为java 1.0和1.1中的日期和时间类(
date
Calendar
TimeZone
DateFormat
SimpleDateFormat
和其他)设计得很差,现在已经过时很久了,当然不再需要使用了。另一方面,我不知道
System.curremttimillis()
有任何设计问题(除了我上面提到的使用
long
毫秒计数,这显然是
Instant.now().toEpochMilli()
System.currentTimeMillis()
固有的)

如果两者之间有轻微的性能差异,我很难想象这种情况会有什么影响

选择在你的上下文中更具可读性、更少令人惊讶的选项

类似问题

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

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


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

更好的定义?性能更好?我打赌他们的表现是一样的。更具可读性?这只是我的看法。但是,我认为两者在性能方面都优于
Calendar.getInstance().getTimeInMillis()
System.currentTimeMillis()
应该更快,因为开销更少(无需创建对象)。就精度而言,
即时
-方法在某些支持微秒分辨率的平台上可能会更好。@ElliottFrisch我更改了措辞:-d真正的问题是为什么要获得时间戳?如果你在计时,那么这可能是一条路要走(如果你想要精确的话)。我可能会寻找更高层次的抽象;比如。@MenoHochschild当两个构造都将截断为毫秒时,微秒的分辨率有什么关系?我想给Instant添加另一个优点。现在()可以用JMockit之类的工具模拟它。System.currentTimeMillis()是本机方法,因此通常不可修改。难道所有时钟都不能漂移吗?什么应该阻止
System.nanoTime()
这样做?