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

时间:2013-10-07 11:04:45

标签: java date format timestamp

刚刚在我的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:我搜索过但发现没有相关(已回答)的问题,例如: Current time in microseconds in java 要么 Get time with hour, minute, second, millisecond, microsecond

5 个答案:

答案 0 :(得分:71)

来自documentation of 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 fiddle

答案 1 :(得分:8)

TL;博士

Instant.now()
       .toString() 
  

2018-02-02T00:28:02.487114Z

Instant.parse(
    "2018-02-02T00:28:02.487114Z"
)

java.time

ppeterka的accepted Answer是正确的。滥用格式化模式会导致错误的数据显示,而内部值总是有限的毫秒。

您正在使用的麻烦的SimpleDateFormatDate类现在已经遗留下来,取而代之的是 java.time 类。 java.time 类处理nanoseconds分辨率,比遗留类的milliseconds限制更精细。

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

Instant instant = myJavaUtilDate.toInstant() ;

Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

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

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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

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

答案 2 :(得分:2)

我还使用了另一种技巧来格式化日期,精确到6位数(微秒):

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:-2)

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