刚刚在我的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
答案 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
答案 1 :(得分:8)
Instant.now()
.toString()
2018-02-02T00:28:02.487114Z
Instant.parse(
"2018-02-02T00:28:02.487114Z"
)
ppeterka的accepted Answer是正确的。滥用格式化模式会导致错误的数据显示,而内部值总是有限的毫秒。
您正在使用的麻烦的SimpleDateFormat
和Date
类现在已经遗留下来,取而代之的是 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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秒,这只不过是微秒。