TL;博士
Instant.now()
2018-03-09T21:03:33.831515Z
使用Java 9及更高版本,您可以使用microseconds分辨率捕获当前时刻.
上面的示例是针对macOS Sierra的Oracle Java 9.0.4.请注意小数秒的6位数,即微秒.
java.time
Java 8及更高版本中内置的java.time框架具有表示日期时间值的类,分辨率为nanoseconds,9位数小数秒.
Java 9
Java 9有一个fresh implementation的Clock,分辨率高达纳秒级.实际值取决于任何特定计算机的基础硬件时钟的限制.
避免使用较旧的日期时间类.与早期版本的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转换为Instant和ZonedDateTime.
关于java.time
要了解更多信息,请参阅Oracle Tutorial.并搜索Stack Overflow以获取许多示例和说明.规格是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC driver.不需要字符串,不需要java.sql.*类.
从哪里获取java.time类?
>内置.
>部分标准Java API,带有捆绑实现.
> Java 9增加了一些小功能和修复.
>大部分java.time功能都被反向移植到Java 6& 07年7月7日.
>更新版本的Android捆绑java.time类的实现.
>对于早期的Android(< 26),ThreeTenABP项目采用ThreeTen-Backport(如上所述).见How to use ThreeTenABP….
ThreeTen-Extra项目使用其他类扩展了java.time.该项目是未来可能添加到java.time的试验场.您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuarter和more.