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.Timestamp
java.sql.Timestamp
Instant
ZonedDateTime
关于 java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧旧日期时间类,如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参阅 Oracle 教程。搜索 Stack Overflow 以获取许多示例和解释。规格是JSR 310。
Joda-Time 项目现在处于维护模式,建议迁移到 java.time 类。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持 java.time。java.sql.*
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。