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 接受的答案是正确的。 滥用格式化模式会导致错误的数据显示,而内部值始终限制为毫秒。
您正在使用的麻烦的SimpleDateFormat
和Date
类现在是遗留的,取而代之的是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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- 更高版本的Android捆绑java.time类的实现。
- 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。
我用另一个技巧来设置日期,以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秒,这只不过是微秒。