关于timstamp getTime diff的谜团

时间:2016-09-22 20:12:46

标签: java timestamp

这是我的代码:

System.out.println(" serverStartTime:" + serverStartTime + " serverRunningTime:" + serverRunningTime);

Timestamp sTime = convertTimeFormat(serverStartTime, "MMM d, yyyy H:mm:ss a z");
Timestamp eTime = convertTimeFormat(serverRunningTime, "MMM d, yyyy H:mm:ss a z");
long diff = (eTime.getTime() - sTime.getTime());
System.out.println("eTime.getTime():" + eTime.getTime() + " sTime.getTime():" + sTime.getTime() + " Time diff:" + diff);

convertTime看起来像:

private Timestamp convertTimeFormat(String msgDate, String srcDateFormat) {
    SimpleDateFormat sdf = new SimpleDateFormat(srcDateFormat);
    SimpleDateFormat output = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        Date d = sdf.parse(msgDate);
        String formattedTime = output.format(d);
        return Timestamp.valueOf(formattedTime);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return null;
}

输出结果为:

serverStartTime:Sep 22, 2016 12:42:56 AM PDT serverRunningTime:Sep 22, 2016 1:33:42 AM PDT
eTime.getTime():1474533222000 sTime.getTime():1474573376000 Time diff:-40154000

请注意,运行时间值小于开始时间。为什么呢?

1 个答案:

答案 0 :(得分:1)

您使用时间格式H - 这是24小时制,所以您的“开始”时间是在正午后,比结束时间晚10个小时。是的,你在格式字符串中也有“AM”,但我相信由于你使用了H而被忽略了。请改用h。始终,请务必仔细检查格式字符串。

Timestamp sTime = convertTimeFormat(serverStartTime, "MMM d, yyyy h:mm:ss a z");
Timestamp eTime = convertTimeFormat(serverRunningTime, "MMM d, yyyy h:mm:ss a z");

请注意,解决此问题的另一种方法是以yyyy-MM-dd HH:mm:ss格式打印中间值。我怀疑你会看到类似的东西:

2016-09-22 12:42:56
2016-09-22 01:33:42

目前尚不清楚这是否真的是你所拥有的,因为你没有在输出格式中设置时区,这几乎肯定是一个问题本身。如果可能的话,我会避免额外的字符串往返。