【问题标题】:Any new method to get current time with accuracy in microseconds in Java now?现在有什么新方法可以在 Java 中以微秒为单位获取当前时间吗?
【发布时间】:2016-02-02 00:55:10
【问题描述】:

我检查了下面的页面,在 2009 年的 Java 中,没有方法可以准确地获取当前时间,以微秒为单位。
Current time in microseconds in java

最好的是 System.currentTimeMillis() 以毫秒为单位提供当前时间,而 System.nanoTime() 以纳秒为单位提供当前时间戳,但此时间戳不能用于转换为高的当前时间准确性。

我可以知道 6 年后是否有任何针对 Java 的新更新?谢谢。

编辑 1. System.nanoTime() 可用于估计持续时间,但不能给出当前时间。

编辑 2. 在 Java 8 中有解决方案很好。在 Java 7 中有没有其他方法可以做到这一点?谢谢!

【问题讨论】:

  • 纳秒比微秒更精确。您的post 中还提供了一个解决方案
  • 当然,计时逻辑的精度完全取决于操作系统和硬件,它实际上并不是 Java 产生的数字。
  • @BasilBourque 谢谢,我已经删除了我的评论。我很久以前就写了那条评论,但并没有完全理解 OP 正在寻找准确性。

标签: java time java-7


【解决方案1】:

Java 8 java.time 包有你需要的东西。

试试:

LocalDateTime.now(); // The current timestamp accurate to nanoseconds
LocalDateTime.now().getLong(ChronoField.MICRO_OF_SECOND); // the microseconds part
LocalDateTime.now().getLong(ChronoField.NANO_OF_SECOND); // even finer
LocalDateTime.now().getDayOfMonth(); // main parts of the date have their own methods
LocalDateTime.now().getMonth(); // etc  

要获取 nanos 作为字符串,请使用 nnnnnnnnn 格式:

LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.nnnnnnnnn"));  

【讨论】:

【解决方案2】:

从新的 Java 8 java.time 获取当前时间的另一种方法是 Clock

Clock.systemUTC().millis()

以毫秒为单位给出当前时间(自纪元以来的长值毫秒)或

Clock.systemUTC().instant()

根据the official Oracle Java tutorial,返回Instant 类的实例“它表示时间轴上一纳秒的开始”。本教程展示了如何使用新类,转换为本地或 UTC 或分区日期时间等

【讨论】:

  • 以下哪一项为您提供以微秒为单位的时间?
【解决方案3】:

tl;博士

Instant.now()

2018-03-09T21:03:33.831515Z

使用Java 9 及更高版本,您可能会以microseconds 分辨率捕捉当前时刻。

上面看到的示例是 Oracle Java 9.0.4 for macOS Sierra。注意小数秒的 6 位数字,表示微秒。


java.time

Java 8 及更高版本中内置的 java.time 框架具有表示日期时间值的类,分辨率为 nanoseconds,9 位小数秒。

Java 9

Java 9 的 fresh implementationClock 具有高达纳秒的分辨率。实际值取决于任何特定计算机的底层硬件时钟的限制。

有关更多信息,请参阅问题Why does the new Java 8 Date Time API not have nanosecond precision?

避免使用较旧的日期时间类。与早期版本的 Java 捆绑的 java.util.Date/.Calendar 等类只有毫秒级的分辨率。 Joda-Time 也一样。两者都被 java.time 类所取代。

Java 8

Java 8 实现了 Clock 接口,只有 millisecond 分辨率(小数秒的 3 位数字)。因此,虽然 java.time 类能够携带纳秒,但它不能捕获纳秒的当前时间。

本机代码

也许您可以编写或找到 Clock 的实现,它调用主机操作系统中的本机库以获得更准确的时间。

数据库

如果您碰巧已经在使用数据库,您可以询问时间。从 JDBC 4.2 及更高版本开始,您可以直接与数据库交换 java.time 对象。

Instant instant = myPreparedStatement.getObject( … , Instant.class ) ;

在 JDBC 4.2 之前,您可能会遇到麻烦的遗留 java.sql.Timestamp,它具有纳秒级分辨率。例如,Postgres 提供microsecond 分辨率(假设主机时钟支持),6 位小数秒。您可以使用添加到旧类的新方法将 java.sql.Timestamp 转换为 InstantZonedDateTime


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。 Hibernate 5 & JPA 2.2 支持 java.time

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2017-11-29
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多