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

java.util.Date格式SSSS:如果不是微秒,最后3位是什么?,java,date,format,timestamp,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

刚刚在我的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数据库交互,在这个数据库中,按时间顺序存储的数据使用计时列作为时间戳,时间戳在秒后为6位,即微秒(IMO)。 但所有这些“时间戳”都是通过请求以下查询创建的:

SELECT current timestamp as currenttimestamp FROM Table ( values (1)) temp
考虑到上述结果,我不知道是否不能在我的代码中使用
newdate()
,而不是从数据库中选择
当前时间戳

谢谢

PS:我搜索了一下,但没有找到相关的(已回答的)问题,例如: 或

来自:

因此它是毫秒,或千分之一秒。您只需将其格式化为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

()

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

我使用了另一个技巧,以6位精度(微秒)格式化日期:


这项技术可以进一步扩展到纳秒甚至更高。

ssss是微秒。假设时间是10:30:22(秒22),10:30:22.1将是22秒和1/10秒。扩展相同的逻辑,10:32.22.000132将是22秒和132/1000000秒,也就是微秒。

tl;博士 2018-02-02T00:28:02.487114Z

java.time 佩特卡的观点是正确的。滥用格式化模式会导致数据显示错误,而内部值始终限制为毫秒

您正在使用的麻烦的
SimpleDateFormat
Date
类现在是遗留类,被java.time类取代。time类处理解析,比遗留类的限制精细得多

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

Instant instant = myJavaUtilDate.toInstant() ;
该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

捕获UTC中的当前时刻。Java 8以毫秒为单位捕获当前时刻,而Java 9中新的
Clock
实现以更精细的粒度(通常为微秒)捕获当前时刻,尽管它取决于计算机硬件时钟、操作系统和JVM实现的能力

Instant instant = Instant.now() ;
生成标准ISO 8601格式的字符串

String output = instant.toString() ;
2018-02-02T00:28:02.487114Z

要生成其他格式的字符串,请在堆栈溢出中搜索
DateTimeFormatter
,这已涉及多次

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

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

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

好的,谢谢,没有检查这个如此简单的解决方案。。。感觉很糟糕!:(@maxyme不必感到难受,我们都会犯错误。有时候,仅仅是看问题太久,就会让人对问题本身视而不见……(我有好几次这样的经历。)有时候,我们需要的只是另一组眼睛。警告:永远不要使用SimpleDataFormat。除非你能保证它的毫秒数,否则用小数秒进行解析,这就是我们如何获得微秒数的方法。公共静态void main(String[]args)抛出ParseException{System.out.println(新的SimpleDataFormat(“yyy-MM-dd hh:MM:ss.ssss”).parse(“2020-10-02 17:17:27.149320”);System.out.println(新简化格式(“yyy-MM-dd hh:MM:ss.SSSSSS”)。parse(“2020-10-02 17:14:58.986670”);)将给Fri Oct 02 17:19:56 AEST 2020 Fri Oct 02 17:31:24 AEST 2020,这是错误的…仅供参考,诸如和
java.text.SimpleDateFormat
等麻烦的旧日期时间类现在被内置于java 8和java 9中的类所取代。请参阅@BasilBourque扩展注释:而老式的
SimpleDateFormat
混淆地将大写的
S
视为毫秒,不管有多少,现代的
DateTimeFormatter
S
视为秒的分数。因此,使用
DateTimeFormatter.ofPattern
可以有意义地指定从1到9的
S
,并获得您预期的结果。新java.text.simpleDataFormat(“yyyy-MM-dd HH:MM:ss.SSSSSS”).parse(“2019-01-01 00:00:00.001000”)返回00:00:01.000!但是
java.util.Date
对象不带微秒,只带毫秒。虽然这在现实世界中是正确的,但对于
SimpleDataFormat
来说却不是正确的。该类确实令人困惑。它太好了,以至于它也过时很久了。
java.util.Date
对象已启用
Instant instant = myJavaUtilDate.toInstant() ;
Instant instant = Instant.now() ;
String output = instant.toString() ;
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;