2015-01-09 78 views
0

在我提出一個關於減去時間的問題之前,我想我已經擁有了它。然而,當我正在調試時,出現了一些錯誤。基本上我問的是創建一個打卡時鐘,但我不能使用Java日曆API。在Java中減去兩倍

用戶將輸入開始時間和他們衝出的時間,它將計算時間之間的差異。

礦井工作不好,我不知道爲什麼。例如,如果凌晨4點開始,並且凌晨12點結束,則返回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); 
    } 
     } 
+1

定義*不工作得很好。*;你有什麼問題? – 2015-01-09 21:14:16

+0

那麼我輸入樣本時間來測試它。 8時14分至2時47分返回6小時33分。我希望它返回5小時27分鐘,但它沒有。我以爲我創建了一個覆蓋一切的循環 – DaBom 2015-01-09 21:15:47

+9

咦?從上午8點14分到下午2點47分,這是6小時33分鐘......你的程序工作正常。 – m0skit0 2015-01-09 21:20:23

回答

1

既然你不能使用Java日曆API,你的方法,而不是非常模塊化的,看上去聲音乍一看。細節決定成敗。

日期時間計算的訣竅都是角落案例。這就是爲什麼沒有人願意編寫和維護這些東西,甚至Sun/Oracle也一次又一次地犯了錯。

證明你的代碼適用於所有條件將會很困難。你最好減少範圍並降低需求。 12或24小時鐘?如果24小時,我們是從0小時還是1小時開始?我們跨越幾天嗎?我們預計會過午夜嗎?等等。

但是你的任務是以模12或24的方式進行比較小時(除非你的要求說你不必「翻身」或跨過12或24小時的界限)。真正的技巧將小時視爲一系列圍欄和欄杆,並計數欄杆。一次性錯誤將成爲你在這裏存在的禍根。

我的建議是使用Java日曆API至少檢查一下結果。

+0

我不知道如何使用它。我想我只是想提交併希望最好。我的頭痛很厲害,現在哈哈 – DaBom 2015-01-09 21:42:31

+0

我同意jdv的建議。請參閱下面的代碼樣本。它使用Java Calender API。 – user1521213 2015-01-09 23:07:16

0

而不是試圖重新發明輪子和自己實現日期減法邏輯,然後嘗試覆蓋所有的角落情況,你可以利用內置的Java日期算術。

像這樣的東西(此代碼複製到TimeDifference.java並運行):

import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.GregorianCalendar; 
import java.util.Scanner; 
import java.util.Calendar; 
import java.util.SimpleTimeZone; 
import java.util.TimeZone; 
import java.util.concurrent.TimeUnit; 

public class TimeDifference { 

    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(); 



     String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000); 
     // if no ids were returned, something is wrong. get out. 
     if (ids.length == 0) 
      System.exit(0); 

     // create a Pacific Standard Time time zone 
     SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]); 

     // set up rules for daylight savings time 
     pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); 
     pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 
       2 * 60 * 60 * 1000); 

     // create a GregorianCalendar with the Pacific Daylight time zone 
     // and the current date and time 
     Calendar startingCalendar = new GregorianCalendar(pdt); 
     Calendar endingCalendar = new GregorianCalendar(pdt); 
     Date trialTime = new Date(); 
     startingCalendar.setTime(trialTime); 
     endingCalendar.setTime(trialTime); 

     startingCalendar.set(java.util.Calendar.HOUR, startingHour); 
     startingCalendar.set(java.util.Calendar.MINUTE, startingMin); 

     if (startingTOD.equalsIgnoreCase("AM")) { 
      startingCalendar.set(java.util.Calendar.AM_PM, 0); 
     } else if (startingTOD.equalsIgnoreCase("PM")) { 
      startingCalendar.set(java.util.Calendar.AM_PM, 1); 
     } else { 
      System.out.println("invalid starting AM/PM. exiting.."); 
      System.exit(-1); 
     } 

     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(); 

     // get the supported ids for GMT-08:00 (Pacific Standard Time) 

     endingCalendar.set(java.util.Calendar.HOUR, endingHour); 
     endingCalendar.set(java.util.Calendar.MINUTE, endingMin); 

     if (endingTOD.equalsIgnoreCase("AM")) { 
      endingCalendar.set(java.util.Calendar.AM_PM, 0); 
     } else if (endingTOD.equalsIgnoreCase("PM")) { 
      endingCalendar.set(java.util.Calendar.AM_PM, 1); 
     } else { 
      System.out.println("invalid ending AM/PM. exiting.."); 
      /* Exit program */ 
      System.exit(-1); 
     } 

     long startingTimeMillis = startingCalendar.getTimeInMillis(); 
     long endingTimeMillis = endingCalendar.getTimeInMillis(); 
     long timeDifferenceMillis = endingTimeMillis - startingTimeMillis; 

     System.out.println(String.format("Time difference between starting and ending time (in minutes and hours): %d hours, %d minutes", 
       TimeUnit.MILLISECONDS.toHours(timeDifferenceMillis), 
       TimeUnit.MILLISECONDS.toMinutes(timeDifferenceMillis) - 
       TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(timeDifferenceMillis)) 
      )); 

     reader.close(); 
    } 

    public static void main(String[] args) { 
     elapsedTime(); 
    } 

} 
+0

從下面的stackover答案中借用了一些代碼:http://stackoverflow.com/questions/625433/how-to-convert-milliseconds-to-x-mins-x-seconds-in-java – user1521213 2015-01-09 23:04:35