Yis*_*ang 13 java epoch milliseconds java-time java.time.instant
在Java中,我们可以有许多不同的方式来获得当前的时间戳,但哪一个建议:
Instant.now().toEpochMilli()或System.currentTimeMillis()
两者都很好。除了少数目的之外,都不推荐。
在 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的日期和时间类的好习惯(Date,Calendar,TimeZone,DateFormat,SimpleDateFormat等)的设计不当,现在早已过时的,肯定不是任何我们应该再使用。在另一方面,我不知道有任何设计问题的System.curremtTimeMillis()特别(除了我上面提到的有关使用long毫秒数可言,这显然是内在都Instant.now().toEpochMilli()和System.currentTimeMillis())。
如果两者之间存在细微的性能差异,我很难想象这会发生什么情况。
选择您认为在您的上下文中更具可读性且不那么令人惊讶的选项。
据我的理解Instant.now().toEpochMilli()更好,因为Instant建议使用 Java-8 以后的版本。
此外,它基于时间线工作,即时代表该时间线上的特定时刻。
对于java.lang.System.currentTimeMillis()方法,它返回当前时间(以毫秒为单位)。该值的粒度取决于底层操作系统,并且可能会更大。
因此,为了保持一致,请完全使用Instant.
不管怎样,我做了一个快速的非理想性能测试来比较这两种方法。
在我的系统(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)
| 归档时间: |
|
| 查看次数: |
8856 次 |
| 最近记录: |