时差 AM/PM 与 Java

Time difference in AM/PM in Java

我正在尝试通过输入时间格式在 12 小时内计算 java 的时差,当我输入开始时间 11:58:10 pm 和结束时间 12:02:15 am 时效果很好。但是当我输入 12:00:00 am 和 12:00:00 pm 时,它给出了 0 分钟的差异。不知道为什么。以下是我的代码,请让我知道我哪里错了。

Scanner input = new Scanner(System.in);
System.out.print("Enter start time (HH:mm:ss aa): ");
String starttime = input.nextLine();

System.out.print("Enter end time (HH:mm:ss aa): ");
String endtime = input.nextLine();

//HH converts hour in 24 hours format (0-23), day calculation
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss aa");

Date d1 = null;
Date d2 = null;

try {
    d1 = format.parse(starttime);
    d2 = format.parse(endtime);

    //in milliseconds
    long diff = d2.getTime() - d1.getTime();

    long diffSeconds = diff / 1000 % 60;
    long diffMinutes = diff / (60 * 1000) % 60;

    System.out.print(diffMinutes + " minutes and "+diffSeconds + " seconds.");
} catch (Exception e) {
    System.out.println("Invalid fromat");
}

新的 java.time 方法 LocalTimeDateTimeFormatterDuration 提供了更好的方法来处理这个问题。例如:

DateTimeFormatter format = DateTimeFormatter.ofPattern("h:m:s a");

LocalTime time1 = LocalTime.parse("12:00:00 am", format);
LocalTime time2 = LocalTime.parse("2:00:20 pm", format);

Duration dur = Duration.between(time1, time2);

System.out.println(dur.toMinutes() + " minutes " + dur.toSecondsPart() + " seconds");

注意:Duration.toSecondsPart 需要 Java 9 或更高版本,此代码的其余部分需要 Java 8 或更高版本。

问题出在以下行:

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss aa");

应该是:

SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");

符号H用于24小时格式的时间,而h用于12格式的时间-小时格式。

你计算的diffMinutes也是错误的

按如下操作:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter start time (hh:mm:ss aa): ");
        String starttime = input.nextLine();

        System.out.print("Enter end time (hh:mm:ss aa): ");
        String endtime = input.nextLine();

        SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss aa");

        Date d1 = null;
        Date d2 = null;

        try {
            d1 = format.parse(starttime);
            d2 = format.parse(endtime);

            // in milliseconds
            long diff = Math.abs(d2.getTime() - d1.getTime());

            long diffSeconds = (diff / 1000) % 60;
            long diffMinutes = (diff / (60 * 1000));

            System.out.print(diffMinutes + " minutes and " + diffSeconds + " seconds.");
        } catch (Exception e) {
            System.out.println("Invalid fromat");
        }
    }
}

样本运行:

Enter start time (hh:mm:ss aa): 10:20:30 am
Enter end time (hh:mm:ss aa): 10:20:13 pm
719 minutes and 43 seconds.

备注:

  1. 如@greg-449 所述,您应该努力使用 modern date-time API
  2. 两个数量之间的差值是一个绝对值,它始终为正,即 2 和 5 之间的差值 = 5 和 2 之间的差值 = 3。Math.abs 给出最适合的数字的绝对值用于找出两个数量之间的差异。
  3. 您需要了解,在不说明日期的情况下,两次之间的差异始终被视为同一日期,即 12:02:15 am 和 11:58:10 pm 之间的差异 = [= 之间的差异60=] pm 和 12:02:15 am = 1435 分 55 秒。一个日期的 11:58:10 pm 和下一个日期的 12:02:15 am 之间的差异是 4 分 5 秒。但是,您的输入仅适用于时间,没有日期元素,因此已考虑同一日期的差异。下面给出的是考虑时间日期的程序。

考虑日期和时间的程序:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter start time (dd.MM.yyyy at hh:mm:ss aa): ");
        String starttime = input.nextLine();

        System.out.print("Enter end time (dd.MM.yyyy at hh:mm:ss aa): ");
        String endtime = input.nextLine();

        SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy 'at' hh:mm:ss aa");

        Date d1 = null;
        Date d2 = null;

        try {
            d1 = format.parse(starttime);
            d2 = format.parse(endtime);

            // in milliseconds
            long diff = Math.abs(d2.getTime() - d1.getTime());

            long diffSeconds = (diff / 1000) % 60;
            long diffMinutes = (diff / (60 * 1000));

            System.out.print(diffMinutes + " minutes and " + diffSeconds + " seconds.");
        } catch (Exception e) {
            System.out.println("Invalid fromat");
        }
    }
}

样本运行:

Enter start time (dd.MM.yyyy at hh:mm:ss aa): 03.03.2020 at 11:58:10 pm
Enter end time (dd.MM.yyyy at hh:mm:ss aa): 04.03.2020 at 12:02:15 am
4 minutes and 5 seconds.