2013-05-16 351 views
-1

我想查找2個月中的日期和使用Java的日期之間的差異。例如:5/16/20137/20/20132個月和4天之間的差異。兩個日期之間的差異

感謝您對此事的考慮。

+3

簡短的回答是使用[JodaTime](http://joda-time.sourceforge.net/) - 它處理的東西,如閏年,秒和所有有趣的東西 – MadProgrammer

+0

可能重複的[計算兩之間的差異Java日期實例](http://stackoverflow.com/questions/1555262/calculating-the-difference-between-two-java-date-instances) – CoolBeans

+1

請參閱[這個答案](http://stackoverflow.com/a/ 16067960/1288408)使用Joda Time解決方案。 –

回答

1

試試這個

 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; 
    } 
+1

我以前使用過這種方法,雖然它很好,但在處理DST和標準日期時有問題,例如,嘗試獲取格林威治標準時間2013-03-09和2013-03-12之間的天數。 –

1

我會做這樣的

Calendar c1 = new GregorianCalendar(2012, 0, 1); 
    Calendar c2 = new GregorianCalendar(2013, 0, 2); 
    int monthDiff = (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR)) * 12 + c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH); 
    int dayDiff; 
    if (c1.get(Calendar.DATE) < c2.get(Calendar.DATE)) { 
     monthDiff--; 
     dayDiff = c1.getActualMaximum(Calendar.DAY_OF_MONTH) - c1.get(Calendar.DATE) + c2.get(Calendar.DATE); 
    } else { 
     dayDiff = c2.get(Calendar.DATE) - c1.get(Calendar.DATE); 
    } 
    System.out.println(monthDiff + " " + dayDiff); 
+1

在短距離和相同時區內,這是可以的,但是當你擴大範圍並開始處理諸如閏年和秒,世紀交叉之類的事情時,它就開始受到影響, – MadProgrammer

0

沒有人說console.log(new Date(「2013-09-30」) - 新日期(「2012-01-01」));它會以毫秒爲單位給出差異。在創建這兩個對象時,它由您來處理時區等等。