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

max*_*yme 31 java format timestamp date

刚刚在我的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()));
    }
Run Code Online (Sandbox Code Playgroud)

并得到类似的结果:

2013-10-07 12:53:26.000905
2013-10-07 12:53:26.000906
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT current timestamp as currenttimestamp FROM Table ( values (1)) temp
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

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

ppe*_*rka 83

SimpleDateFormat文档:

Letter     Date or Time Component     Presentation     Examples  
S          Millisecond                Number           978 
Run Code Online (Sandbox Code Playgroud)

所以它是毫秒,或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));
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

(Ideone小提琴)

  • @maxxyme不需要感到可怕,我们都会犯错误.有时仅仅通过长时间地查看问题就会使问题本身失明......(我曾经有过这么多次.)有时人们需要的只是另一组眼睛. (10认同)
  • 警告:永远不要使用带有小数秒的 SimpleDateFormat .parse,除非你能保证它的毫秒数并且 <= 999。实际上,不要使用 SimpleDateFormat。 (2认同)

Bas*_*que 9

TL;博士

Instant.now()
       .toString() 
Run Code Online (Sandbox Code Playgroud)

2018-02-02T00:28:02.487114Z

Instant.parse(
    "2018-02-02T00:28:02.487114Z"
)
Run Code Online (Sandbox Code Playgroud)

java.time

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

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

相当于java.util.Datejava.time.Instant.您甚至可以使用添加到旧类的新方法在它们之间进行转换.

Instant instant = myJavaUtilDate.toInstant() ;
Run Code Online (Sandbox Code Playgroud)

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

捕获UTC中的当前时刻.Java 8以毫秒为单位捕获当前时刻,而ClockJava 9中的新实现以更精细的粒度捕获时刻,通常为微秒,但这取决于计算机硬件时钟和操作系统和JVM实现的功能.

Instant instant = Instant.now() ;
Run Code Online (Sandbox Code Playgroud)

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

String output = instant.toString() ;
Run Code Online (Sandbox Code Playgroud)

2018-02-02T00:28:02.487114Z

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

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

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

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

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

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.