在Java中计算两次之间的时差

时间:2017-10-22 17:16:49

标签: java date timedelta localtime

    String time1 = br.readLine();
    DateFormat sdf = new SimpleDateFormat("hh:mm:ss",Locale.ENGLISH);
    Date d1 = sdf.parse(time1);
    int n = Integer.parseInt(br.readLine());
    for(int i=0;i<n;i++) {
        String time2 = br.readLine();
        Date d2 = sdf.parse(time2);
        long diffMs = d1.getTime() - d2.getTime();
        System.out.println(diffMs/(1000*60*60));

输入:

time1 = 23:05:38
time2 = 12:36:07

输出应 10 ,但它会 22

1 个答案:

答案 0 :(得分:1)

首先,我假设计算发生在没有夏令时(DST)和其他异常的时区,或者至少在没有过渡的日期。

我遗漏了BufferedReader的阅读,因为你似乎已经处理好了。

    String time1 = "23:05:38";
    LocalTime t1 = LocalTime.parse(time1);
    String time2 = "12:36:07";
    LocalTime t2 = LocalTime.parse(time2);
    Duration diff = Duration.between(t2, t1);
    System.out.println(diff.toHours());

这会打印预期的

  

10

正如您所看到的,我正在the comment中关注Deb的建议:使用modern Java date and timeAPI known as JSR-310 or java.time。这会自动解决您的问题,因为LocalTime在没有任何明确格式化的情况下在24小时制解析您的时间,因此无法在格式模式字符串中使用错误的大小写。

这是对的,我同意d.j.brown你的模式中的小写hh是罪魁祸首。您的时间被解释为23:05:38 AM,这是无稽之谈,但过时的SimpleDateFormat只是意味着晚上11:05:38,即24小时制23:05:38,是你所期待的。恕我直言,让你在不告诉你的情况下逃脱这样的错误是非常讨厌的。你很幸运有一个以“12”开头的时间,因为12:36:07 AM意味着在24小时时间0:36:07,所以这次你得到了错误的结果并且意识到出了什么问题。否则你的bug会被忽视,也许很长一段时间。这个带有士气的长篇故事:远离SimpleDateFormat

问题:我可以在Java版本中使用现代API吗?

如果至少使用Java 6 ,则可以。