0

我正在尝试通过输入时间格式在 12 小时内计算 java 中的时差,当我输入开始时间11:58:10 pm和结束时间时效果很好12:02:15 am。但是当我进入上午 12:00:00 和下午 12:00:00 时,差异为 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");
}
4

2 回答 2

3

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 或更高版本。

于 2020-03-03T18:21:33.393 回答
1

问题出在以下行:

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 所提到的,您应该努力使用现代日期时间 API
  2. 两个量之间的差是一个绝对值,始终为正,即 2 和 5 之间的差 = 5 和 2 之间的差 = 3。Math.abs为您提供最适合找出两个量之间差的数字的绝对值。
  3. 您需要了解,在不告知日期的情况下,始终将两次之间的差异视为同一日期,即 12:02:15 am 和 11:58:10 pm 之间的差异 = 11:58:10 pm 和上午 12:02:15 = 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.
于 2020-03-03T20:20:06.900 回答