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之前,可以使用toInstant
和from
方法在java.sql.Timestamp和java.time之间来回切换。