计算夜间到早晨之间持续时间的算法

Algorithm for calculating duration between Night-Morning

我被大学作业中给出的持续时间计算问题困住了。因此,用户可以输入开始时间和结束时间,其中小时和分钟分别输入程序。小时以 24 小时格式 (00 - 23) 输入。我的程序使用简单的 'Ending time - Starting time' 成功计算了 'Ending time' 大于 'Starting time' 的持续时间。例如:23.55 - 22.55 = 1 小时。但是当这样的事情发生时,我的问题就出现了,'Starting time = 23.45' 和 'Ending time = 00.45'。因此,较早的方法对此不起作用。

所以我需要一点帮助,因为我仍在学习 Java 的基础知识,这是大学作业,我不能做任何超出课程(复杂的东西)。所以我宁愿留在基础知识(BODMAS)上去做。请询问是否需要更多信息!

提前致谢!

这个有效:

if (start_time > end_time) end_time += 24 hours
duration = end_time - start_time

或者更简洁

duration = end_time + (end_time < startTime ? 24 : 0) - start_time

区分 end_time == start_time 是零小时还是 24 小时所需的更改留作练习。

java.time

我推荐你使用java.timeAPI来做。这些步骤可以概括为以下几点:

  1. 在开始时间和结束时间使用当前日期创建 LocalDateTime 的实例。
  2. 如果结束时间的 LocalDateTime 实例在开始时间之前,将结束时间的实例重置为午夜,然后加上一天,最后将时间应用于它。
  3. 使用java.time.Duration获取LocalDateTime实例之间的持续时间。

演示:

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the start hour: ");
        int startHour = scanner.nextInt();
        System.out.print("Enter the start minute: ");
        int startMinute = scanner.nextInt();
        System.out.print("Enter the start hour: ");
        int endHour = scanner.nextInt();
        System.out.print("Enter the start minute: ");
        int endMinute = scanner.nextInt();

        LocalDate date = LocalDate.now();

        LocalDateTime startDateTime = date.atTime(LocalTime.of(startHour, startMinute));
        LocalDateTime endDateTime = date.atTime(LocalTime.of(endHour, endMinute));

        if (startDateTime.isAfter(endDateTime)) {
            endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(LocalTime.of(endHour, endMinute));
        }

        Duration duration = Duration.between(startDateTime, endDateTime);

        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        System.out.println(
                "Total duration: " + String.format("%02d:%02d", duration.toHours(), duration.toMinutes() % 60));
        // ##############################################################################

        // ####################################Java-9####################################
        System.out.println(
                "Total duration: " + String.format("%02d:%02d", duration.toHoursPart(), duration.toMinutesPart()));
        // ##############################################################################
    }
}

样本运行:

Enter the start hour: 23
Enter the start minute: 45
Enter the start hour: 0
Enter the start minute: 45
PT1H
Total duration: 01:00
Total duration: 01:00

java.time.Duration is modelled on ISO-8601 standards and was introduced with Java-8 as part of JSR-310 implementationJava-9 引入了一些更方便的方法。

Trail: Date Time[了解更多关于java.timeAPI的信息=54=].

  • 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它向后移植了大部分 java.time 功能到 Java 6 & 7.
  • 如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring and