java.util.Date格式SSSSSS:如果不是微秒,那么最后3位数是多少?

刚刚在我的Windows(8)工作站和AIX上测试了这段代码:

public static void main(String[] args) { System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date())); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(new Date())); } 

并得到类似的结果:

 2013-10-07 12:53:26.000905 2013-10-07 12:53:26.000906 

有人可以解释一下,如果不是微秒,最后的数字是什么?

注意:我与DB2数据库进行交互,其中使用定时列作为TIMESTAMP存储按时间顺序排列的数据,其中6位数字在秒之后,即微秒(IMO)。 但是所有这些“时间戳”都是通过请求以下查询来创建的:

 SELECT current timestamp as currenttimestamp FROM Table ( values (1)) temp 

我想知道,鉴于上述结果,我不能只在我的代码中使用new Date()而不是从数据库中选择current timestamp

谢谢。

PS:我搜索过但发现没有相关(已回答)的问题,例如: java中的当前时间(以微秒为单位)或以小时,分钟,秒,毫秒,微秒获取时间

从SimpleDateFormat的文档 :

 Letter Date or Time Component Presentation Examples S Millisecond Number 978 

所以它是毫秒 ,或1/1000秒。 你只需要用6位数字格式化它,所以你添加3个额外的前导零…

你可以这样检查:

  Date d =new Date(); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").format(d)); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS").format(d)); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(d)); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSS").format(d)); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSS").format(d)); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(d)); 

输出:

 2013-10-07 12:13:27.132 2013-10-07 12:13:27.132 2013-10-07 12:13:27.132 2013-10-07 12:13:27.0132 2013-10-07 12:13:27.00132 2013-10-07 12:13:27.000132 

( Ideone小提琴 )

TL;博士

 Instant.now() .toString() 

2018-02-02T00:28:02.487114Z

java.time

ppeterka 接受的答案是正确的。 滥用格式化模式会导致错误的数据显示,而内部值始终限制为毫秒。

您正在使用的麻烦的SimpleDateFormatDate类现在是遗留的,取而代之的是java.time类。 java.time类处理纳秒分辨率,比传统类的毫秒限制更精细。

java.util.Date的等价物是java.time.Instant 。 您甚至可以使用添加到旧类的新方法在它们之间进行转换。

 Instant instant = myJavaUtilDate.toInstant() ; 

Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

以UTC格式捕获当前时刻。 Java 8以毫秒为单位捕获当前时刻,而Java 9中的新Clock实现以更精细的粒度捕获瞬间,通常是微秒,尽管它取决于计算机硬件时钟和OS和JVM实现的function。

 Instant instant = Instant.now() ; 

生成标准ISO 8601格式的字符串。

 String output = instant.toString() ; 

2018-02-02T00:28:02.487114Z

要生成其他格式的字符串,请搜索DateTimeFormatter Stack Overflow,已经多次覆盖。

要调整为UTC以外的时区,请使用ZonedDateTime

 ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ; 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。

我用另一个技巧来设置日期,以6位精度(微秒):

 System.out.println( new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.").format(microseconds/1000) +String.format("%06d", microseconds%1000000)); 

这种技术可以进一步扩展到纳秒级以上。

如果要在文本表示中获得小数秒,请使用java.sql.Timestamp.toString。 来自DB和Java Date的Timestamp之间的差异是DB精度是纳秒,而Java Date精度是毫秒。

SSSSSS是微秒。 让我们说时间是10:30:22(秒22)和10:30:22.1将是22秒和1/10秒。 扩展相同的逻辑,10:32.22.000132将是22秒和132 / 1,000,000秒,这只不过是微秒。