背景
在我的数据库表中,我有两个时间戳
timeStamp1 = 2011-08-23 14:57:26.662
timeStamp2 = 2011-08-23 14:57:26.9
当我执行“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";
}
}
答案应该是238毫秒,但返回的值是-653毫秒。 我不确定我做错了什么。有什么建议吗?
答案 0 :(得分: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");
}
打印
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
答案 1 :(得分:12)
我不完全确定,但JavaDoc说明了这一点:
对于解析,除非需要分隔两个相邻的字段,否则将忽略模式字母的数量。
这表示2011-08-23 14:57:26.9
的毫秒数将被解析为9
而不是900
。添加尾随零可能有效:2011-08-23 14:57:26.900
。
答案 2 :(得分:3)
我遇到了同样的问题,我的日志文件的时间太准了,只有6位数毫秒。解析时间差异达16分钟! WTF?
16-JAN-12 04.00.00.999999 PM GMT --> 16 Jan 2012 04:16:39 GMT
更改位数减少了错误的差异,由于这个线程,我可以确定问题:
16-JAN-12 04.00.00.99999 PM GMT --> 16 Jan 2012 04:01:39 GMT
16-JAN-12 04.00.00.9999 PM GMT --> 16 Jan 2012 04:00:09 GMT
16-JAN-12 04.00.00.999 PM GMT --> 16 Jan 2012 04:00:00 GMT
由于SimpleDateFormat
内部只处理3位数字,我使用小型正则表达式删除了不必要的数字(忽略了舍入错误,工作1到 n 数字):
str = str.replaceAll("(\\.[0-9]{3})[0-9]*( [AP]M)", "$1$2");
感谢@Peter Lawrey的回答,让我感到疯狂: - )
答案 3 :(得分:3)
我建议使用Joda-Time。它正确处理这些情况。在以下示例中,毫秒被正确解析为200毫秒。
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class ParseMillis {
public static void main(String[] args) {
String s = "00:00:01.2";
DateTimeFormatter format = DateTimeFormat.forPattern("HH:mm:ss.S");
DateTime dateTime = format.parseDateTime(s);
System.out.println(dateTime.getMillisOfSecond());
}
}