简短精炼
Instant.now()
2018-03-09T21:03:33.831515Z
使用 Java 9 及其之后的版本,你可以以微秒分辨率捕捉当前时刻。
上方的示例是适用于macOS Sierra 的 Oracle Java 9.0.4。请注意6位小数,即微秒。
java.time
Java 8及其后续版本内置了java.time框架,其中的类可以表示日期时间值,分辨率为纳秒,即小数点后9位。
Java 9
Java 9的OpenJDK实现具有Clock
的全新实现,可达到纳秒级分辨率。实际值取决于任何特定计算机的底层硬件时钟限制。
更多信息请参见问题为什么新的Java 8日期时间API没有纳秒精度?。
避免使用旧的日期时间类。早期版本的Java中捆绑的java.util.Date/.Calendar等类仅具有毫秒级分辨率。Joda-Time也是如此。这两个类都被java.time类所取代。
Java 8
Java 8使用Clock
接口仅具有毫秒分辨率(3位小数秒)。因此,虽然java.time类能够携带纳秒,但无法捕获当前时间的纳秒。
本地代码
也许您可以编写或找到一个Clock
实现,它调用主机操作系统中的本地库以获取更准确的时间。
数据库
如果您已经在使用数据库,则可以向其请求时间。从JDBC 4.2及更高版本开始,您可以直接与数据库交换java.time对象。
Instant instant = myPreparedStatement.getObject( … , Instant.class ) ;
在JDBC 4.2之前,您可以通过麻烦的传统
java.sql.Timestamp
遍历,它具有纳秒分辨率。例如,
Postgres提供
微秒 分辨率(假设主机计算机时钟支持该分辨率),即6位小数秒。您可以使用添加到旧类中的新方法将
java.sql.Timestamp
转换为
Instant
和
ZonedDateTime
。
![enter image description here](https://istack.dev59.com/9eaXs.webp)
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了老旧的传统日期时间类,如{{link3:java.util.Date
}}、{{link4:Calendar
}}和{{link5:SimpleDateFormat
}}。
想要了解更多,请参阅Oracle教程。并在Stack Overflow上搜索许多示例和解释。规范是JSR 310。
Joda-Time项目现在处于维护模式,建议迁移到java.time类。
您可以直接使用java.time对象与数据库进行交换。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,无需java.sql.*
类。Hibernate 5和JPA 2.2支持java.time。
如何获取java.time类?
ThreeTen-Extra项目通过添加类来扩展java.time。这个项目是可能未来增加的java.time类的试验场所。你可以在这里找到一些有用的类,例如Interval, YearWeek, YearQuarter和更多。