我正在使用java.text.SimpleDateFormat解析MS SQL日期,但它给了我错误的输出。根据{{3}}的文档,它应该正确解析或者可能是我遗漏了一些东西。
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秒的差异?
答案 0 :(得分:3)
你已经指定有2870000毫秒 - 这是47分50秒。
重要的是要注意,在SimpleDateFormat
中,S
是毫秒说明符,而不是“第二部分”说明符。基本上,如果你指定的时间超过SSS
,它就会变坏。
现在就您的问题而言 - 如果您从数据库中获取日期,则根本不应该使用字符串值进行解析 - 您应该拥有java.sql.Date
或java.sql.Timestamp
。如果您将日期/时间数据存储为文本,那么您应该单独解决这个问题。
如果您有进行此解析,我只需切掉最后四位数字,然后在最后用.SSS
解析它。这不像java.util.Date
无论如何都能保持亚毫秒精度。
或者,您可以使用java.time
或Joda Time作为很多更好的日期/时间API - java.time
支持纳秒级精度。在DateTimeFormatter
内,S
格式说明符 表示“分数秒”。