java.util.Date format SSSSS:如果不是微秒,最后3位数字是什么?tl;博士java.time关于 java.time

2022-08-31 17:26:50

刚刚在我的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中的当前时间(以微秒为单位) or 获取小时,分钟,秒,毫秒,微秒的时间


答案 1

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

(伊东小提琴)


答案 2

tl;博士

Instant.now()
       .toString() 

2018-02-02T00:28:02.487114Z

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

java.time

ppeterka接受的答案是正确的。滥用格式设置模式会导致错误地显示数据,而内部值始终是有限的毫秒。

您正在使用的麻烦和类现在是遗留的,被java.time类所取代。java.time 类处理纳秒分辨率,比旧类的毫秒限制精细得多。SimpleDateFormatDate

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

Instant instant = myJavaUtilDate.toInstant() ;

Instant 类以 UTC 格式表示时间轴上的某个时刻,分辨率为纳秒(最多九 (9) 位小数)。

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

Instant instant = Instant.now() ;

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

String output = instant.toString() ;

2018-02-02T00:28:02.487114Z

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

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

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

关于 java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧日期时间类,如java.util.DateCalendarSimpleDateFormat

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

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

从哪里获取 java.time 类?

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