java - Java 中的两次减法

标签 java time

在我问了一个关于减去时间的问题之前,我以为我已经知道了。然而,当我调试时,出现了一些错误。基本上我要求的是创建一个打卡钟,但我无法使用 Java Calendar API。

用户输入开始时间和打卡时间,系统会计算时间差。

我的功能不太好,我不知道为什么。例如,如果 4:00am 为开始,12:00am 为结束,则返回 8 小时 00 分钟。这是不正确的。我想我为可能性创建了一个 if 语句。

这是我的代码:

     public static void elapsedTime()
    {
        Scanner reader = new Scanner (System.in);

        System.out.print("Enter the beginning hour: ");
        int startingHour = reader.nextInt();

        System.out.print("Enter the beginning minute(s): ");
        int startingMin = reader.nextInt();


        System.out.print("Enter AM/PM: ");
        reader.nextLine();
        String startingTOD = reader.nextLine();


        System.out.print("Enter the ending hour: ");
        int endingHour = reader.nextInt();

        System.out.print("Enter the ending minute(s): ");
        int endingMin = reader.nextInt();

        System.out.print("Enter AM/PM:  ");
        reader.nextLine();
        String endingTOD = reader.nextLine();

        System.out.println();

        int hours;
        int minutes = endingMin - startingMin;
        String Am = "am" ;
        String Pm = "pm" ;

       if (endingTOD.equalsIgnoreCase(startingTOD) &&  minutes <  0  )
       {
           hours = (endingHour - startingHour) -1 ;
           minutes = minutes + 60 ;
           System.out.println(hours +  " "  + minutes);

        }
     else  if (endingHour > startingHour&& endingTOD.equalsIgnoreCase(startingTOD) &  minutes > 0  )
       {
           hours = endingHour - startingHour;
           System.out.println(hours + " " + minutes);
        }
      else  if (endingHour > startingHour && endingTOD.equalsIgnoreCase(startingTOD) && minutes == 0  )
     {
         hours = (endingHour-startingHour);
         minutes = 0;
         System.out.println(hours + " " + minutes);
     }
   else  if (endingHour < startingHour && endingTOD.equalsIgnoreCase(startingTOD) && minutes == 0  )
     {
         hours = (endingHour-startingHour) + 12;
         minutes = 0;
         System.out.println(hours + " " + minutes);
     }
   else if ( endingHour==startingHour && minutes == 0)
   {
        hours = 12;
        minutes = 0;
        System.out.println(hours + " " + minutes);
    }
    else if (( endingTOD.equalsIgnoreCase(Pm) && startingTOD.equalsIgnoreCase(Am)) && minutes > 0)
    {
        hours = (endingHour - startingHour) + 12;
        System.out.println(hours + " " + minutes);
    }

 else if  (( endingTOD.equalsIgnoreCase(Pm) && startingTOD.equalsIgnoreCase(Am)) && minutes < 0)
       {
           hours = (endingHour - startingHour) -1 ;
           minutes = minutes + 60 ;
           System.out.println(hours +  " "  + minutes);

        }
 else if (endingHour > startingHour && ( endingTOD.equalsIgnoreCase(Pm) && startingTOD.equalsIgnoreCase(Am)) && minutes == 0)
    {
        hours = (endingHour-startingHour) + 12;
        minutes = 0;
       System.out.println(hours +  " "  + minutes);
    }
    else if (endingHour < startingHour &&( endingTOD.equalsIgnoreCase(Pm) && startingTOD.equalsIgnoreCase(Am)) && minutes == 0)
    {
        hours = (endingHour - startingHour) +24;
        minutes = 0;
       System.out.println(hours +  " "  + minutes);
    }
   else if (endingHour < startingHour &&( endingTOD.equalsIgnoreCase(Pm) && startingTOD.equalsIgnoreCase(Am)) && minutes > 0)
    {
        hours = (endingHour - startingHour) + 2;
        System.out.println(hours + " " + minutes);
    }
        }

最佳答案

鉴于您无法使用 Java Calendar API,您的方法虽然不是很模块化,但乍一看似乎很合理。细节决定成败。

日期时间计算的技巧都是极端情况。这就是为什么没有人愿意编写和维护这样的东西,甚至Sun/Oracle也一次又一次地出错。

证明您的代码适用于所有条件将会很困难。您最好缩小范围并降低要求。 12 小时制还是 24 小时制?如果是 24 小时制,是从 0 点开始还是 1 点开始?我们跨越了几天吗?我们预计会穿越午夜吗?等等

但是您的任务是以 12 或 24 为模的方式比较时间(除非您的要求要求您不必“滚动”或跨越 12 或 24 小时界限。)真正的技巧是思考小时数作为一系列栅栏柱和铁轨,并计算铁轨的数量。一次性错误将成为你在这里生存的祸根。

我的建议是至少使用 Java Calendar API 来仔细检查您的结果。

关于java - Java 中的两次减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27869302/

相关文章:

java - 配置取决于启动模式

java - 显示异构项目列表时采用什么设计方法

python - 让 Python 脚本每小时执行一些操作

time - Flot 未正确显示 x Axis 标签

php - 如果超过给定时间则停止运行 php 函数

Java - 从一个类到另一个类的变量值

java - 如何在Android中将日期时间转换为十六进制

linux - 将毫秒添加到时间戳(bash,unix)

date - 黑莓日历或日期.roll()、.add()?

java - Jaxb:根元素中的 xsi 被替换为 ns2