SimpleDateFormat没有正确解析毫秒

2022-09-01 14:23:08

背景:

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

timeStamp1 = 2011-08-23 14:57:26.662
timeStamp2 = 2011-08-23 14:57:26.9

当我做一个“按时间戳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";
    }
}

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


答案 1

您正在解析的格式和所使用的格式不匹配。您需要一个三位数的字段,并且只提供一位数。它需要并假设你的意思是当你想要的是.日期格式很复杂,当您以不同的格式证明日期时,它可能会以不同的方式解析它们。9009900

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


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

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");
}

指纹

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

答案 2

我不完全确定,但JavaDoc指出:

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

这表示从 中的毫秒数将被解析为 而不是 。添加尾随零可能有效:。2011-08-23 14:57:26.999002011-08-23 14:57:26.900