现在,在Java中,有什么新方法可以以微秒为单位获得当前时间吗?tl;博士java.time本机代码数据库关于 java.time

2022-09-04 01:30:33

我检查了下面的页面,在2009年的Java中,没有办法以微秒为单位获得准确的当前时间。
在 java 中,当前时间(以微秒为单位)

最好的一个是System.currentTimeMillis(),它以毫秒为单位给出当前时间,而System.nanoTime()以纳秒为单位给出当前时间戳,但这个时间戳不能用于以高精度转换为当前时间。

我能知道6年后Java是否有任何新的更新吗?谢谢。

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

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


答案 1

tl;博士

Instant.now()

2018-03-19T10:03:33.831515Z

使用Java 9及更高版本,您可以以微秒分辨率捕获当前时刻。

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


java.time

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

Java 9

Java 9 具有高达纳秒分辨率的新实现。实际值取决于任何特定计算机的基础硬件时钟的限制。Clock

有关更多信息,请参阅问题,为什么新的 Java 8 日期时间 API 不具有纳秒精度?

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

爪哇 8

Java 8 仅以毫秒级分辨率(3 位小数秒)实现时钟接口。因此,虽然java.time类能够携带纳秒,但它无法用纳秒捕获当前时间。

本机代码

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

数据库

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

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

在 JDBC 4.2 之前,您可能会遇到麻烦的遗留问题,这些遗留问题具有纳秒级的分辨率。例如,Postgres 提供微秒级分辨率(假设主机时钟支持这一点),即 6 位小数秒。您可以使用添加到旧类的新方法从 a 转换为 a。java.sql.Timestampjava.sql.TimestampInstantZonedDateTime

enter image description here


关于 java.time

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

要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310

Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。

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

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter


答案 2

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"));  

推荐