Разница во времени в AM / PM в Java - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь рассчитать разницу во времени в java по формату времени ввода в 12 часов, это хорошо работает, когда я ввожу время начала 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");
}

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Новые java.time методы LocalTime, DateTimeFormatter и Duration предоставляют гораздо лучшие методы для обработки этого. Например:

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 или более поздней версии.

1 голос
/ 03 марта 2020

Проблема со следующей строкой:

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

Это должно быть:

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

Ваш расчет diffMinutes также неверен.

Do это выглядит следующим образом:

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

public class Main {
    public static void main(String[] args) throws InterruptedException {
        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. As @ greg-449 упомянул, вы должны стремиться использовать современный API даты и времени .
  2. Разница между двумя величинами является абсолютной величиной, которая всегда положительна, т.е. разница между 2 и 5 = разница между 5 и 2 = 3. Math.abs дает вам абсолютное значение числа, которое лучше всего подходит для нахождения разницы между двумя величинами.
  3. Необходимо понимать, что, не сообщая о дате, разница между двумя временами всегда учитывается одна и та же дата, т.е. разница между 12:02:15 и 23:58:10 = разница между 11:58:10 и 12:02:15 = 1435 минут и 55 секунд. Разница между 11:58:10 вечера в одну дату и 12:02:15 в следующую дату составляет 4 минуты 5 секунд. Тем не менее, вы вводите только для времени и не имеет элемента даты, и поэтому разница была учтена для той же даты. Ниже приведена программа для рассмотрения даты со временем.

Программа, учитывающая дату со временем:

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

public class Main {
    public static void main(String[] args) throws InterruptedException {
        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.
...