2012-12-10 100 views
2

可能重複:
Calculating the Difference Between Two Java Date Instances
how to calculate difference between two dates using java我想在java中的兩個日期之間的區別?

我用一些例子試圖差的兩個日期,但我沒有得到正確的答案。

java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); 
java.util.Date date1 = df.parse("2012-09-14 15:26:14+00"); 
java.util.Date date2 = df.parse("2012-08-30 15:26:14+00"); 
long diff = Math.abs(date2.getTime() - date1.getTime()); 
System.out.println("millisecond="+diff); 

我想月份的差異,但它沒有給我。它給了我不同的日子,小時,分鐘和秒,但不是月。我做錯了什麼?請幫我

編輯:

java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-mm-dd hh:mm:ss"); 
java.util.Date date1 = df.parse("2012-09-30 15:26:14+00"); 
java.util.Date date2 = df.parse("2012-08-30 15:26:14+00"); 
long diff = Math.abs(date2.getTime() - date1.getTime()); 
System.out.println(date2.getTime()+"date2"); 
System.out.println(date1.getTime()+"date1"); 
System.out.println("millisecond="+diff); 
diff=diff/1000; 
System.out.println("second="+diff); 
long days=diff/86400; 
days=days%86400; 
long hours=diff/3600; 
hours=hours%3600; 
long min=diff/60; 
min=min%60; 
hours=(hours-(24*days)); 
String time=days+":"+hours+":"+min; 
System.out.println(time); 
System.out.println("days="+days+":"+"hours="+hours+":"+"minutes"+min); 

這就是我要做的。

+2

'yyyy-mm-dd'應該是'yyyy-MM-dd',因爲'mm'表示分鐘,而不是月。 –

+0

另外,'hh'表示12小時制,你應該用24小時制的'HH'來正確解析小時。 – Jesper

+0

@PeterLawrey:謝謝我的問題解決了。 –

回答

5

您可以使用Joda time library for Java。計算日期之間的時差會容易得多。

Sample snippet for time-diff

Days d = Days.daysBetween(startDate, endDate); 
int days = d.getDays(); 
+1

我不想使用喬達時間庫。我想使用simpleDateFormat()。 –

1

Date.getTime回報毫秒,不秒。你需要除以1000來獲得秒。

long diff = Math.abs(date2.getTime() - date1.getTime())/1000; 

此外正如評論中提到的格式字符串不正確。它應該是這樣的:

"yyyy-MM-dd HH:mm:ss" 
0

你到達那裏是毫秒的兩個日期,而不是秒之間數量的差別。請注意,您提供的日期之間的差異並非整整一個月。

2

稱之爲getDuration(date1,date2,Calendar.MONTH);

public static long getDuration(Date returnTime, Date leaveTime, int scale) { 
     long durationInMillis = returnTime.getTime() - leaveTime.getTime(); 
     switch (scale) { 
      case Calendar.MINUTE: 
       return durationInMillis/ONE_MINUTE_IN_MILLIS; 
      case Calendar.MILLISECOND: 
       return durationInMillis; 
      case Calendar.SECOND: 
       return durationInMillis/ONE_SECOND_IN_MILLIS; 
      case Calendar.HOUR: 
       return durationInMillis/ONE_HOUR_IN_MILLIS; 
      case Calendar.DAY_OF_YEAR: 
      case Calendar.DATE: 
       return durationInMillis/ONE_DAY_IN_MILLIS; 
      case Calendar.MONTH: 
       return durationInMillis/ONE_MONTH_IN_MILLIS; // 30days per month 
     } 
     throw new IllegalArgumentException("invalid scale specified"); 
    } 
0

首先讓我們改變yyyy-mm-dd hh:mm:ss到yyyy-MM-dd HH:mm:ss。

日期之間的差異可以使用Calendar類來計算,下面是我的基於日曆的解決方案,不確定它是最好的,但它肯定是在做它的工作。它會計算填寫月份中的日期差異,即2012-09-30 15:26:14 + 00 - 2012-08-30 15:26:14 + 00爲1個月。但2012-09-30 15:26:14 + 00 - 2012-08-30 15:26:15 + 00是0個月。 請注意,區域設置也很重要,因爲結果取決於節電設置。 我不會希望對其進行評論,一切都是從代碼

public static void main(String[] args) throws Exception { 
    java.text.DateFormat df = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    java.util.Date date1 = df.parse("2012-09-30 15:26:14+00"); 
    java.util.Date date2 = df.parse("2012-08-30 15:26:14+00"); 
    int diff = getMonthDifference(date1, date2); 
    System.out.println(diff); 
} 

清楚。

public static int getMonthDifference(java.util.Date date1, java.util.Date date2) { 
    if (date1.after(date2)) { 
     return getMonthDifference0(date1, date2); 
    } else if (date2.after(date1)) { 
     return -getMonthDifference0(date2, date1); 
    } 
    return 0; 
} 

private static int getMonthDifference0(java.util.Date date1, java.util.Date date2) { 
     Calendar c1 = Calendar.getInstance(); 
     Calendar c2 = Calendar.getInstance(); 
     c1.setTime(date1); 
     c2.setTime(date2); 
     int diff = 0; 
     while (c2.getTimeInMillis() < c1.getTimeInMillis()) { 
      c2.add(Calendar.MONTH, 1); 
      diff++; 
     } 
     int dd = c2.get(Calendar.DAY_OF_MONTH) - c1.get(Calendar.DAY_OF_MONTH); 
     if (dd > 0) { 
      diff--; 
     } else if (dd == 0) { 
      int hd = c2.get(Calendar.HOUR_OF_DAY) - c1.get(Calendar.HOUR_OF_DAY); 
      if (hd > 0) { 
       diff++; 
      } else if (hd == 0) { 
       long t1 = c1.getTimeInMillis() % (60 * 1000); 
       long t2 = c2.getTimeInMillis() % (60 * 1000); 
       if (t2 > t1) { 
        diff--; 
       } 
      } 
     } 
     return diff; 
    }