我检查了下面的页面,在 2009 年的 Java 中没有方法可以精确地以微秒为单位获取当前时间。
Current time in microseconds in java
最好的是 System.currentTimeMillis() ,它给出当前时间,精度为毫秒,而 System.nanoTime() 给出当前时间戳,精度为纳秒,但是这个时间戳不能用来转换为当前时间,精度很高准确性。
我想知道 Java 6 年后是否有任何新的更新?谢谢。
编辑 1. System.nanoTime() 对于估计持续时间很有用,但不能给出当前时间。
编辑 2. 在 Java 8 中有解决方案很好。在 Java 7 中还有其他方法吗?谢谢!
最佳答案
tl;dr
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 implementation Clock
分辨率高达纳秒级。实际值取决于任何特定计算机的底层硬件时钟的限制。
有关更多信息,请参阅问题,Why does the new Java 8 Date Time API not have nanosecond precision? .
避免使用较旧的日期时间类。 java.util.Date/.Calendar 等与早期版本的 Java 捆绑在一起的类只有毫秒分辨率。同样适用于 Joda-Time .两者都被 java.time 类取代。
Java 8
Java 8 实现了 Clock
仅与 millisecond 接口(interface)分辨率(小数秒的 3 位数字)。因此,虽然 java.time 类能够携带纳秒,但它无法捕获纳秒的当前时间。
原生代码
也许您可以编写或找到 Clock
的实现调用主机操作系统中的 native 库以获得更准确的时间。
数据库
如果您碰巧已经在使用数据库,您可以询问它的时间。从 JDBC 4.2 及更高版本开始,您可以直接与数据库交换 java.time 对象。
Instant instant = myPreparedStatement.getObject( … , Instant.class ) ;
在 JDBC 4.2 之前,您可能会遇到麻烦的遗留 java.sql.Timestamp
,它具有纳秒分辨率。例如,Postgres提供 microsecond分辨率(假设主机时钟支持),小数秒的 6 位数字。您可以使用添加到旧类的新方法将 java.sql.Timestamp
转换为 Instant
和 ZonedDateTime
。
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .
Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。
您可以直接与您的数据库交换java.time 对象。使用JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.*
类。 Hibernate 5 和 JPA 2.2 支持 java.time。
从哪里获取 java.time 类?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , 以及后来的 - 标准 Java API 的一部分,带有捆绑实现。
- Java 9带来了一些次要功能和修复。
- Java SE 6和 Java SE 7
- 在 ThreeTen-Backport 中,大部分 java.time 功能都向后移植到 Java 6 和 7。 .
- Android
- 更高版本的 Android(26+)捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),进程 API desugaring带来一个subset of the java.time Android 最初未内置的功能。
- 如果脱糖没有提供您需要的东西,ThreeTenABP项目改编ThreeTen-Backport (上面提到的)Android。参见 How to use ThreeTenABP… .
ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 more .
关于java - 现在有什么新方法可以在 Java 中以微秒为单位准确获取当前时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33472569/