SimpleDateFormat 以毫秒为单位的错误输出 ( SSSSSSS )

Wrong output of SimpleDateFormat with milliseconds ( SSSSSSS )

我正在用 java.text.SimpleDateFormat 解析 MS SQL 日期,但它给了我错误的输出。根据 SimpleDateFormat 的文档,它应该正确解析或者可能是我遗漏了什么。

System.out.println( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSSSSSS" ).parse( "2016-02-29 13:02:50.2870000 +00:00" ) );
Incorrect Output with milliseconds format
>> Mon Feb 29 13:50:40 PKT 2016

但是,如果我在没有 SSSSS 的情况下尝试,它会给我预期的结果。

System.out.println( new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).parse( "2016-02-29 13:02:50.2870000 +00:00" ) );
Correct Output without milliseconds format
>> Mon Feb 29 13:02:50 PKT 2016

为什么相差47分50秒?

您指定了 2870000 毫秒 - 即 47 分 50 秒。

请务必注意,在 SimpleDateFormat 中,S 毫秒 说明符,而不是 "fraction of second" 说明符。基本上,如果您指定的值超过 SSS,结果会很糟糕。

现在就你的问题而言 - 如果你从数据库中获取日期,你根本不应该有一个 string 值来解析 - 你应该有一个java.sql.Datejava.sql.Timestamp。如果您将 date/time 数据存储为文本,这是一个您应该单独解决的问题。

如果您 执行此解析,我会砍掉最后四位数字并在末尾用 .SSS 解析它。无论如何,java.util.Date 都不能保持亚毫秒精度。

或者,您可以使用 java.time 或 Joda Time 作为 很多 更好的 date/time API - 并且 java.time 支持纳秒精度。在 DateTimeFormatter 中,S 格式说明符 的意思是 "fraction-of-second".