计算Java中两次的时间差

Calculating the time difference between two times in Java

    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.

首先,我假设计算发生在没有夏令时 (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

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

是的,我同意 d.j.brown,你的模式中的小写字母 hh 是罪魁祸首。您的时间被解释为23:05:38 AM,这是无稽之谈,但是过时的SimpleDateFormat只是将其理解为11:05:38 PM,即24小时制的23:05:38,即是你所期望的。恕我直言,让你在没有告诉你的情况下摆脱这样的错误是非常令人讨厌的。你很幸运有一个以“12”开头的时间,因为 12:36:07 AM 在 24 小时制中意味着 0:36:07,所以这次你得到了一个错误的结果,并且意识到出了点问题。否则你的错误可能会被忽视很长时间。长篇大论承载士气:远离SimpleDateFormat.

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

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

  • 在 Java 8 及更高版本中内置了新的 API。
  • 在 Java 6 和 7 get the ThreeTen Backport 中,新 类 的向后移植(即 JSR-310 的 ThreeTen,其中首次定义了现代 API ).
  • 在 Android 上,使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP,我认为 .
  • 中有精彩的解释