我正在尝试生成程序在程序执行结束时完成作业所需的总时间。以下是我正在使用的代码行,以实现此目的。
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。虽然我可以想象,这可能是一个非常普遍面临的问题,我尽力在网上搜索这个问题的最佳关键词,但没有什么吸引我的眼球。有人可以对此有所了解吗?
任何回应都是很有意义的。谢谢。
答案 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()))));