查找日期范围之间的月数和日期

时间:2014-05-30 04:28:48

标签: java

我在数据库中有一个开始日期和结束日期,如下所示。

  

开始日期:2014年6月1日结束日期:2014年6月30日

     

开始日期:2014年7月1日结束日期:2014年9月30日

     

开始日期:2014年10月1日结束日期:2015年3月31日

如果我输入日期范围

  

开始日期02/06/2014
结束日期01/02/2015

输出必须是。

28 days, in 1st slab date range

2 months, 29 days, in 2nd slab date range

4 months in 3rd slab date range

如何在java中实现这一点。

提前致谢。

3 个答案:

答案 0 :(得分:1)

这个问题很难准确回答。我相信这就是你真正想要的,

// get the minimum of any number of dates.
private static Date getMinimum(Date... dates) {
  if (dates == null)
    return null;
  Date min = dates[0];
  for (Date d : dates) {
    if (d.compareTo(min) < 0) {
      min = d;
    }
  }
  return min;
}

// get the maximum of any number of dates.
private static Date getMaximum(Date... dates) {
  if (dates == null)
    return null;
  Date max = dates[0];
  for (Date d : dates) {
    if (d.compareTo(max) > 0) {
      max = d;
    }
  }
  return max;
}

public static String getDateDiff(Date startDate,
    Date endDate) {
  StringBuilder sb = new StringBuilder();
  Calendar start = Calendar.getInstance();
  start.setTime(getMinimum(startDate, endDate));
  Calendar end = Calendar.getInstance();
  end.setTime(getMaximum(startDate, endDate));
  if (start.compareTo(end) < 0) {
    int monthCount = 0;
    int dayCount = 0;
    while (start.compareTo(end) < 0) {
      start.add(Calendar.MONTH, 1);
      if (start.compareTo(end) < 0) {
        monthCount++;
      }
    }
    start = Calendar.getInstance();
    start.setTime(getMinimum(startDate, endDate));
    start.add(Calendar.MONTH, monthCount);
    while (start.compareTo(end) < 0) {
      start.add(Calendar.DAY_OF_MONTH, 1);
      if (start.compareTo(end) < 0) {
        dayCount++;
      }
    }
    if (monthCount > 0) {
      sb.append(String.format("%d months",
          monthCount));
    }
    if (dayCount > 0) {
      if (sb.length() > 0) {
        sb.append(", ");
      }
      sb.append(String.format("%d days", dayCount));
    }
  } else {
    sb.append("0 days");
  }

  return sb.toString();
}

public static void main(String[] args) {
  String[] input = { "01/06/2014-30/06/2014", //
      "01/07/2014-30/09/2014", //
      "01/10/2014-31/03/2015", //
      "02/06/2014-01/02/2015", };
  DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
  for (String str : input) {
    String sArr[] = str.split("-");
    try {
      Date start = df.parse(sArr[0]);
      Date end = df.parse(sArr[1]);
      System.out.printf("start: %s, end: %s - diff: %s\n", sArr[0],
          sArr[1], getDateDiff(start, end));
    } catch (ParseException e) {
      e.printStackTrace();
    }
  }
}

输出

start: 01/06/2014, end: 30/06/2014 - diff: 28 days
start: 01/07/2014, end: 30/09/2014 - diff: 2 months, 28 days
start: 01/10/2014, end: 31/03/2015 - diff: 5 months, 29 days
start: 02/06/2014, end: 01/02/2015 - diff: 7 months, 29 days

答案 1 :(得分:0)

Please check whether below code is helpful. I am using this.

public String getDifference(Date date1, Date date2){
    long difference = date2.getTime() - date1.getTime();
    long diffDays = difference / (24 * 60 * 60 * 1000);
    return (diffDays/30)+" months and "+(diffDays%30)+" days";
}

答案 2 :(得分:0)

public int monthsBetweenDates(Date startDate, Date endDate){

        Calendar start = Calendar.getInstance();
        start.setTime(startDate);
        Calendar end = Calendar.getInstance();
        end.setTime(endDate);

          int monthsBetween = 0;
            int dateDiff = end.get(Calendar.DAY_OF_MONTH)-start.get(Calendar.DAY_OF_MONTH);      
            if(dateDiff<0) {
                int borrrow = end.getActualMaximum(Calendar.DAY_OF_MONTH);           
                 dateDiff = (end.get(Calendar.DAY_OF_MONTH)+borrrow)-start.get(Calendar.DAY_OF_MONTH);
                 monthsBetween--;
                 if(dateDiff>0) {
                     monthsBetween++;
                 }
            }
            else {
                monthsBetween++;
            }      
            monthsBetween += end.get(Calendar.MONTH)-start.get(Calendar.MONTH);      
            monthsBetween  += (end.get(Calendar.YEAR)-start.get(Calendar.YEAR))*12;      
            return monthsBetween;
     }