Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 减去两个长值时的一小时差_Java_Date_Subtraction - Fatal编程技术网

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

Java 减去两个长值时的一小时差,java,date,subtraction,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).getTim

我试图生成程序在执行结束时完成打印作业所需的总时间。下面是我用来实现这一点的代码行

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。虽然我可以想象,这可能是一个非常普遍面临的问题,但我尽了最大努力在网上搜索这个问题的最佳关键字,但什么都没有引起我的注意。有人能解释一下吗


任何反应都是非常特殊的。谢谢。

您正在格式化一个数字,因为正在包装和取消包装长字符

试试这个

 ).format(new Date(endTime - startTime)));
或者至少

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

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

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):

输出:

1969-12-31 16:00:00.582
您正在构建一个
日期
,其零值为UTC 1970年1月1日00:00:00,但它是在您自己的本地时区中构建的,该时区似乎比UTC 1970年1月1日早了一个小时


不要使用时间间隔构建日期。

我成功地生成了我想要的。如果有人需要,下面是代码:

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

请注意,持续时间/期间不是日期。看起来您应该使用
新日期(endTime-startTime)
,即使您继续使用此方法…@SotiriosDelimanolis,但他应该获得基于1970年1月1日0:00的日期(因此,1970年1月1日0:00:00.582)似乎没有什么理由从
long
值到
Date
再返回。我想知道
格式(long)
是否可以编译。也许改用Joda时间(至少在Java8到来之前)。@谢谢大家的回复。
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();
}