SimpleDateFormat无法正确解析毫秒数

dku*_*rni 26 java date simpledateformat

背景:

在我的数据库表中,我有两个时间戳

timeStamp1 = 2011-08-23 14:57:26.662
timeStamp2 = 2011-08-23 14:57:26.9
Run Code Online (Sandbox Code Playgroud)

当我执行"ORDER BY TIMESTAMP ASC"时,timeStamp2被认为是更大的时间戳(这是正确的).

要求:我需要得到这些时间戳的差异(timeStamp2 - timeStamp1)

我的实施:

public static String timeDifference(String now, String prev) {
    try {
        final Date currentParsed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(now);
        final Date previousParsed = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(prev);
        long difference = currentParsed.getTime() - previousParsed.getTime();
        return "" + difference;
    } catch (ParseException e) {
        return "Unknown";
    }
}
Run Code Online (Sandbox Code Playgroud)

答案应该是238毫秒,但返回的值是-653毫秒.我不确定我做错了什么.有什么建议?

Pet*_*rey 17

您正在解析的格式和格式使用不匹配.您期望三位数字段,并且只提供一位数字.它需要9并假设你的意思是009什么时候你想要的900.日期格式很复杂,当您以不同的格式证明日期时,它可能会以不同的方式对您进行解析.

文档说明S意味着毫秒数和该字段中的数字是9,因此它的行为正确.


编辑:这个例子可能会有所帮助

final SimpleDateFormat ss_SSS = new SimpleDateFormat("ss.SSS");
ss_SSS.setTimeZone(TimeZone.getTimeZone("GMT"));
for (String text : "0.9, 0.456, 0.123456".split(", ")) {
  System.out.println(text + " parsed as \"ss.SSS\" is "
      + ss_SSS.parse(text).getTime() + " millis");
}
Run Code Online (Sandbox Code Playgroud)

版画

0.9 parsed as "ss.SSS" is 9 millis
0.456 parsed as "ss.SSS" is 456 millis
0.123456 parsed as "ss.SSS" is 123456 millis
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 12

我不完全确定,但JavaDoc说明了这一点:

对于解析,除非需要分隔两个相邻字段,否则将忽略模式字母的数量.

这表示毫秒2011-08-23 14:57:26.9将被解析为9而不是900.添加尾随零可能有效:2011-08-23 14:57:26.900.