减去两个长值时的一小时差异

时间:2013-09-26 16:08:32

标签: java date subtraction

我正在尝试生成程序在程序执行结束时完成作业所需的总时间。以下是我正在使用的代码行,以实现此目的。

long startTime = System.currentTimeMillis(), endTime;
//actual programming logic
 endTime = System.currentTimeMillis();
System.out.println((new SimpleDateFormat("HH:mm:ss.SSS").format(new Date(endTime).getTime() - new Date(startTime).getTime())));

结果是01:00:00.582,而不是00:00:00.582。虽然我可以想象,这可能是一个非常普遍面临的问题,我尽力在网上搜索这个问题的最佳关键词,但没有什么吸引我的眼球。有人可以对此有所了解吗?

任何回应都是很有意义的。谢谢。

3 个答案:

答案 0 :(得分:4)

运行与您的代码类似的代码时:

long startTime = System.currentTimeMillis(), endTime;
try { Thread.sleep(582); } catch (InterruptedException ignored) {}
endTime = System.currentTimeMillis();
System.out.println((new SimpleDateFormat("HH:mm:ss.SSS").format(
    new Date(endTime).getTime() - new Date(startTime).getTime())));

我得到了这个输出:

16:00:00.582

显示日期显示我所在的时区(UTC-8):

System.out.println((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(
    new Date(endTime).getTime() - new Date(startTime).getTime())));

输出:

1969-12-31 16:00:00.582

您正在构建一个Date,其零值为UTC时间1970年1月1日00:00:00,但是在您自己的本地时区构建,该时区似乎比1月的UTC提前一小时1970年1月1日。

不要使用时间间隔构建Date

答案 1 :(得分:2)

我成功地制作了我想要的东西。如果有人需要,这是代码:

static String fn_Z_getTimeDifference(Long startTime, Long endTime)
{
    long processTime = endTime - startTime;
    long days = processTime / 86400000L;
    processTime -= days * 86400000L;
    long hours = processTime / 3600000L;
    processTime -= hours * 3600000L;
    long mins = processTime / 60000L;
    processTime -= mins * 60000L;
    long seconds = processTime / 1000L;
    processTime -= seconds * 1000L;
    long milliSeconds = processTime ;
    return (Long.toString(hours)+ ":" + Long.toString(mins) + ":" + Long.toString(seconds) + ":" + Long.toString(milliSeconds)).toString();
}

答案 2 :(得分:0)

您正在格式化数字,因为包装和展开长片。

试试这个

 ).format(new Date(endTime - startTime)));

或至少

 ").format(new Date(new Date(endTime).getTime() - new Date(startTime).getTime()))));