2017-04-24 46 views
1

我試圖獲得兩個時間值之間的時間差。 (11:00:00和12:43:00)上面的輸入顯示正確的輸出。兩次使用java之間的時間差

**

Time in seconds: 6180 seconds. 
Time in minutes: 103 minutes. 
Time in hours: 1 hours. 
Time in hours Round : 2 hours. 

** 輸入值( 「11:00:00」 和 「2點43分00秒」),它應該給我們3小時圓形值 **

Time in seconds: -29820 seconds. 
Time in minutes: -497 minutes. 
Time in hours: -8 hours. 
Time in hours Round : -8 hours. 

**

import java.lang.Math; 
import java.text.SimpleDateFormat; 
import java.util.Date; 


public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 


String dateStart = "11:00:00"; 
String dateStop = "12:43:00"; 
// Custom date format 
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); 
Date d1 = null; 
Date d2 = null; 
try { 
    d1 = format.parse(dateStart); 
    d2 = format.parse(dateStop); 
} catch (Exception e) { 
    e.printStackTrace(); 
}  

// Get msec from each, and subtract. 
long diff = d2.getTime() - d1.getTime(); 
long diffSeconds = diff/1000;   
long diffMinutes = diff/(60 * 1000);   
long diffHours = diff/(60 * 60 * 1000);    
int parkingEntry=2; 
int firstHour=3; 
int parkingRate=4; 
int Total=0; 

System.out.println("Time in seconds: " + diffSeconds + " seconds.");   
System.out.println("Time in minutes: " + diffMinutes + " minutes.");   
System.out.println("Time in hours: " + diffHours + " hours."); 

double my_hrs=diffMinutes/60d; 
    int r = (int) Math.round(my_hrs); 
System.out.println("Time in hours Round : " + r + " hours."); 


    } 
} 
+0

嘗試使用長diffInMillis = d2.getTimeInMillis() - d1.getTimeInMillis() –

+5

嘗試使用['Duration']( https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html)和['LocalTime'](https://docs.oracle.com/javase/8/docs/api /java/time/LocalTime.html) – MadProgrammer

+0

@ user7790438,這將不會編譯(如果它確實,將不會幫助提問者的問題)。你在'Calendar'類中的方法令人困惑。 「日期」和「日曆」之間的不一致只是當您更改爲「本地時間」和「持續時間」(如MadProgrammer建議的)時很大程度上克服的一個問題。 –

回答

1

格式「H H:mm:ss是24小時格式。因此,當您檢查「11:00:00」和「2:43:00」之間的時差時,實際上是在檢查上午11點到上午2:43之間的時差。

將輸入更改爲「11:00:00」和「14:43:00」。

+0

是的,我可以理解,我們如何才能隱藏日期格式的這種投入? – user885791

+0

http:// stackoverflow。com/questions/6907968/how-to-convert-24-hr-format-time-in-to-12-hr-format,http://stackoverflow.com/questions/6531632/conversion-from-12-hours-時間至24小時的時在-java的。請在下次明確指出問題。 – Ray

+0

其他選項包括:將am/pm標記添加到輸入字符串,並在格式中使用'hh'。或者如果第二次出現在第一次之前,則加上12小時(再次,'LocalDate'或'Duration'更容易)。 –

0

您的基本問題是您的輸入不足以計算差異。你不知道時間是在中午之前還是之後(在上午或下午)。最好的解決方案是在輸入中要求這些信息。無論是通過使用24小時(因爲您的格式HH已經建議)或通過添加AM/PM標記到輸入。

假設你不能改變輸入,你當然可以盡你最大的努力。如果停止時間似乎在開始時間之前,可能是因爲開始時間是AM和停止時間PM。請注意,這遠沒有防彈性:它仍將計算從6點到7點的時間爲1小時,可能從早上6點到晚上7點,也就是13個小時。

我將藉此機會展示如何與java.time類做到這一點:

// Two formats, for AM and PM 
    final String basicTimeFormatPattern = "h:mm:ss"; 
    DateTimeFormatter amFormat = new DateTimeFormatterBuilder().appendPattern(basicTimeFormatPattern) 
      .parseDefaulting(ChronoField.AMPM_OF_DAY, 0) 
      .toFormatter(); 
    DateTimeFormatter pmFormat = new DateTimeFormatterBuilder().appendPattern(basicTimeFormatPattern) 
      .parseDefaulting(ChronoField.AMPM_OF_DAY, 1) 
      .toFormatter(); 
    LocalTime t1 = LocalTime.parse(dateStart, amFormat); 
    LocalTime t2 = LocalTime.parse(dateStop, amFormat); 
    if (t2.isBefore(t1)) { 
     // parse in PM instead 
     t2 = LocalTime.parse(dateStop, pmFormat); 
    } 
    Duration diff = Duration.between(t1, t2); 
    System.out.println("Time in seconds: " + diff.getSeconds() + " seconds.");   
    long diffMinutes = diff.toMinutes(); 
    System.out.println("Time in minutes: " + diffMinutes + " minutes.");   
    System.out.println("Time in hours: " + diff.toHours() + " hours."); 

的代碼大小差不多是你的,但請注意,代碼行度過了困難的部分解析不完整的輸入並確定AM和PM,而時間單位之間的微小轉換由庫方法完成,並且不會填充我們自己的代碼。圓形小時的計算可以在你的問題代碼中完成,所以我把它排除了。

上面打印:

Time in seconds: 6180 seconds. 
Time in minutes: 103 minutes. 
Time in hours: 1 hours. 
Time in hours Round : 2 hours. 

或用dateStop = "2:43:00"

Time in seconds: 13380 seconds. 
Time in minutes: 223 minutes. 
Time in hours: 3 hours. 
Time in hours Round : 4 hours.