【问题标题】:Calculating the time difference between two times in Java在Java中计算两次之间的时间差
【发布时间】:2018-04-03 06:29:35
【问题描述】:
    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

【问题讨论】:

  • hh 是 12 小时格式,HH 是 24 小时格式。我怀疑这是你的问题。
  • 顺便说一句,使用 LocalTime 和 Duration 会容易得多。
  • @Deb,我认为这不仅仅是一个旁注,它是问题的合理解决方案。现代类通常不会让您使用hh 而不是HH 进行解析,因此会首先防止问题出现。我认为这比事后解决要好得多。
  • 现在你不应该再使用Date了。而是使用包 java.time 内的 Java 的新日期/时间 API。

标签: java date timedelta localtime


【解决方案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,这是无稽之谈,但过时的 SimpleDateFormat 只是将其理解为晚上 11:05:38,即 24 小时制的 23:05:38,这就是你已经预料到了。恕我直言,让您在不告诉您的情况下逃脱这样的错误是非常令人讨厌的。你很幸运有一个以“12”开头的时间,因为 12:36:07 AM 表示 24 小时制的 0:36:07,所以这次你得到了错误的结果,并被告知有问题。否则你的错误可能会被忽视,可能很长一段时间。说来话长,鼓舞士气:远离SimpleDateFormat

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

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

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2014-09-21
    • 1970-01-01
    • 2016-12-17
    相关资源
    最近更新 更多