Javadate分析,精度为微秒或纳秒

根据SimpleDateFormat类文档 , Java在其date模式中不支持超过毫秒的时间粒度。

所以,像一个datestring

  • 2015-05-09 00:10:23.999750900 //最后9位数字表示纳秒

当通过模式parsing

  • yyyy-MM-dd HH:mm:ss.SSSSSSSSS // 9个'S'符号

实际上解释了整个数字之后. 符号(接近10亿!)毫秒,而不是纳秒,导致date

  • 2015-05-20 21:52:53 UTC

即超过11天。 令人惊讶的是,使用较小数量的S符号仍然会导致所有9位数字被parsing(而不是最后的3位.SSS )。

有两种方法可以正确处理这个问题:

  • 使用string预处理
  • 使用自定义的SimpleDateFormat实现

是否有任何其他方式获得正确的解决scheme,只需提供一个模式到标准的SimpleDateFormat实现,而不需要任何其他的代码修改或string操作?

不,你不能使用SimpleDateFormat来处理纳秒。

但是你的前提是…

Java在date模式中不支持超过毫秒的时间粒度

Java 8中不再是真实的。

java.time

SimpleDateFormat和相关的java.util.Date / .Calendar类现在已经被Java 8( Tutorial )中新的java.time包所淘汰了。

新的java.time类支持纳秒分辨率。 这种支持包括parsing和生成小数秒的九位数字。 例如,当您使用java.time.format DateTimeFormatter API时, S模式字母表示“秒的小数”而不是“毫秒”,并且可以处理纳秒级的值。

  2013-08-20T12:34:56.123456789Z 

java.sql.Timestamp

java.sql.Timestamp类也可以处理纳秒级的分辨率,但方式尴尬。 一般最好在java.time类里面做你的工作。

在JDBC驱动程序更新为直接支持java.time数据types之前,可以使用toInstantfrom方法在java.sql.Timestamp和java.time之间来回切换。