求java方法, 同时计算出两个日期的月差和日差!

大家好,

求java 方法 计算出两日期的 月差及日差

比如 : 开始日:2011/03/17 结束日 2012/02/13 两个日期 月差为 10, 日差 为 28

               谢谢大家! 

这个还真有点麻烦,说明见注释,做了个测试示例:
[code="java"]
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class CalculateDateTest {

public static void main(String[] args) {

    DateCalculate dateCalculate = DateCalculate.calculate("2011/03/17", "2012/02/13");
    System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
    System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
    System.out.println();

    dateCalculate = DateCalculate.calculate("2011/03/30", "2011/04/13");
    System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
    System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
    System.out.println();

    dateCalculate = DateCalculate.calculate("2011/03/31", "2011/04/13");
    System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
    System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
    System.out.println();

    dateCalculate = DateCalculate.calculate("2011/03/17", "2011/04/18");
    System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
    System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
    System.out.println();

    dateCalculate = DateCalculate.calculate("2011/03/17", "2012/01/13");
    System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
    System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
    System.out.println();

    dateCalculate = DateCalculate.calculate("2011/03/31", "2012/03/13");
    System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
    System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
    System.out.println();

    dateCalculate = DateCalculate.calculate("2011/03/31", "2012/05/13");
    System.out.println("月差为: " + dateCalculate.getDifferenceOfMonths());
    System.out.println("天差为: " + dateCalculate.getDifferenceOfDays());
    System.out.println();

}

}

/**

  • @author lxbccsu
    *日期比较差值不包括起始日期,包括最后日期
    */
    class DateCalculate{

    private long differenceOfMonths;//月份差值
    private long differenceOfDays;//天数差值

    static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

    public static DateCalculate calculate(String startdate, String endDate){
    try {
    return calculate(dateFormat.parse(startdate),dateFormat.parse(endDate));
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return null;
    }

    /**

    • 计算差值,注意 endDate > startDate
    • @param startDate
    • @param endDate
    • @return
      */
      public static DateCalculate calculate(Date startDate, Date endDate){
      if(startDate.after(endDate)) return null;
      System.out.println("开始日:" + dateFormat.format(startDate) + ", 结束日: "+ dateFormat.format(endDate));
      DateCalculate dataCalculate = new DateCalculate();

      Calendar firstDay = Calendar.getInstance();
      Calendar lastDay = Calendar.getInstance();
      firstDay.setTime(startDate);
      lastDay.setTime(endDate);

      //算出天数总差值
      long allDays = ((lastDay.getTimeInMillis()) - (firstDay.getTimeInMillis()))/(1000*24*60*60);

      Calendar loopEndDay = calculateLoopEndOfDate(firstDay,lastDay);
      System.out.println("循环终止日期 : " + dateFormat.format(loopEndDay.getTime()));

      dataCalculate.setDifferenceOfDays(0);
      dataCalculate.setDifferenceOfMonths(0);

      int month = firstDay.get(Calendar.MONTH);
      while(!firstDay.equals(loopEndDay)){
      firstDay.add(Calendar.DAY_OF_MONTH, 1);
      allDays--;
      if(month != firstDay.get(Calendar.MONTH)){
      month = firstDay.get(Calendar.MONTH);
      dataCalculate.setDifferenceOfMonths(dataCalculate.getDifferenceOfMonths()+1);
      }
      }
      dataCalculate.setDifferenceOfDays(allDays);
      return dataCalculate;

    }

    /**

    • 计算循环终止日期
    • 例如:开始日:2011/03/17 结束日 2012/02/13 ,循环终止日期 2012/01/17;
    • @param startDate
    • @param endDate
    • @return
      */
      private static Calendar calculateLoopEndOfDate(Calendar startDate, Calendar endDate) {
      int year = endDate.get(Calendar.YEAR);
      int month = endDate.get(Calendar.MONTH);
      int day = startDate.get(Calendar.DAY_OF_MONTH);
      int maxDaysInMonth = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));

      if(year > startDate.get(Calendar.YEAR)){
      if(month == Calendar.JANUARY){
      year -= 1;
      month = Calendar.DECEMBER;
      }else{
      if(day > maxDaysInMonth){
      month -= 1;
      endDate.set(year, month, 1);
      day = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));
      }else{
      if(day > endDate.get(Calendar.DAY_OF_MONTH)){
      month -= 1;
      endDate.set(year, month, 1);
      maxDaysInMonth = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));;
      if(day > maxDaysInMonth){
      day = maxDaysInMonth;
      }
      }
      }
      }
      }else{
      if(day > maxDaysInMonth){
      month -= 1;
      endDate.set(year, month, 1);
      day = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));
      }else{
      if(day > endDate.get(Calendar.DAY_OF_MONTH)){
      month -= 1;
      endDate.set(year, month, 1);
      maxDaysInMonth = getMaxDaysOfMonth(new GregorianCalendar(year,month,1));
      if(day > maxDaysInMonth){
      day = maxDaysInMonth;
      }
      }
      }
      }

      return new GregorianCalendar(year, month, day);
      }

    /**

    • 获取一月最大天数,考虑年份是否为润年
    • (对API中的 getMaximum(int field)不了解, date.getMaximum(Calendar.DAY_OF_MONTH)却不是月份的最大天数)
    • @param date
    • @return */ private static int getMaxDaysOfMonth(GregorianCalendar date) { int month = date.get(Calendar.MONTH); int maxDays = 0; switch(month){ case Calendar.JANUARY: case Calendar.MARCH: case Calendar.MAY: case Calendar.JULY: case Calendar.AUGUST: case Calendar.OCTOBER: case Calendar.DECEMBER: maxDays = 31; break; case Calendar.APRIL: case Calendar.JUNE: case Calendar.SEPTEMBER: case Calendar.NOVEMBER: maxDays = 30; break; case Calendar.FEBRUARY: if(date.isLeapYear(date.get(Calendar.YEAR))){ maxDays = 29; }else{ maxDays = 28; } break; } return maxDays; }

    public long getDifferenceOfMonths() {
    return differenceOfMonths;
    }

    public void setDifferenceOfMonths(long differenceOfmonths) {
    this.differenceOfMonths = differenceOfmonths;
    }

    public long getDifferenceOfDays() {
    return differenceOfDays;
    }

    public void setDifferenceOfDays(long differenceOfDays) {
    this.differenceOfDays = differenceOfDays;
    }
    }
    [/code]

Calendar类 会用吧.
直接设置这两个时间段的Calendar对象 c1.getTime - c2.getTime
相减获得时间设置
可以将结果设置到c3

然后使用c3获得月 --相差月
获得日期将c3.getTime --毫秒数
/1000/60/60/24 --相差天数了

Calendar很容易用. java自己的类

嗖嗖 Calendar 方法 吧,一下你就会明白了.

[code="java"]

/**

  • 求两个日期相差天数
  • @param sd
  • 起始日期,格式yyyy-MM-dd
  • @param ed
  • 终止日期,格式yyyy-MM-dd
  • @return 两个日期相差天数
    */
    public static long getIntervalDays(String sd, String ed) {
    return ((java.sql.Date.valueOf(ed)).getTime() - (java.sql.Date
    .valueOf(sd)).getTime())
    / (3600 * 24 * 1000);
    }

    /**

  • 起始年月yyyy-MM与终止月yyyy-MM之间跨度的月数。

  • @param beginMonth

  •        格式为yyyy-MM
    
  • @param endMonth

  •        格式为yyyy-MM
    
  • @return 整数。
    */
    public static int getInterval(String beginMonth, String endMonth) {
    int intBeginYear = Integer.parseInt(beginMonth.substring(0, 4));
    int intBeginMonth = Integer.parseInt(beginMonth.substring(beginMonth
    .indexOf("-") + 1));
    int intEndYear = Integer.parseInt(endMonth.substring(0, 4));
    int intEndMonth = Integer.parseInt(endMonth.substring(endMonth
    .indexOf("-") + 1));

    return ((intEndYear - intBeginYear) * 12)

    • (intEndMonth - intBeginMonth) + 1; } [/code]

[code="java"]

static Calendar getCalendar(String time)
{
    if (null == time)
    {
        return null;
    }
    String[] times = time.split("/");
    Calendar calendar = Calendar.getInstance();
    calendar.set(Integer.valueOf(times[0]), Integer.valueOf(times[1]), Integer.valueOf(times[2]));
    return calendar;
}

public static void main(String[] args)
{
    String startTime1 = "2011/03/17";
    String startTime2 = "2012/02/13";
    Calendar c1 = getCalendar(startTime1);
    Calendar c2 = getCalendar(startTime2);

    System.out.println("月相差:"+(c2.get(Calendar.MONTH)-c1.get(Calendar.MONTH)+12));
    System.out.println("日相差:"+(c1.getMaximum(Calendar.DAY_OF_MONTH)-c1.get(Calendar.DAY_OF_MONTH)+c2.get(Calendar.DAY_OF_MONTH)));
}

[/code]

[code="java"]

static Calendar getCalendar(String time)
{
if (null == time)
{
return null;
}
String[] times = time.split("/");
Calendar calendar = Calendar.getInstance();
calendar.set(Integer.valueOf(times[0]), Integer.valueOf(times[1]), Integer.valueOf(times[2]));
return calendar;
}

public static void main(String[] args)
{
    String startTime1 = "2011/03/17";
    String startTime2 = "2010/03/13";
    Calendar c1 = getCalendar(startTime1);
    Calendar c2 = getCalendar(startTime2);

    System.out.println("日相差:"
            + (c1.getMaximum(Calendar.DAY_OF_MONTH) - c1.get(Calendar.DAY_OF_MONTH) + c2.get(Calendar.DAY_OF_MONTH)));

    int month = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH);
    if (month == 0)
    {
        if (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR) == 0)
        {
            System.out.println("月相差 :0 ");
        }
        if (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR) > 0)
        {
            System.out.println("月相差 :12 ");
        }
        if (c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR) < 0)
        {
            System.out.println("月相差 :-12 ");
        }
    }
    else if (month > 0)
    {

        System.out.println("月相差:" + (c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH)));
    }
    else if (month < 0)
    {

        System.out.println("月相差:" + (c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH) + 12));
    }
}

[/code]
上面代码有问题,可以试试这个。

可以用 时间戳···

public class Test {
static String date1 = "2011/03/17";
static String date2 = "2012/02/13";
/**
* 转换字符串日期 为时间戳(long)
* @param strTime
* @return
*/
public static Long parseStrTime(String strTime){
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
Long time = null;
try {
time = df.parse(strTime).getTime();
} catch (ParseException e) {
System.out.println("时间戳转换错误!");
e.printStackTrace();
}
return time;
}

public static void main(String[] args) {
    long longNum = Test.parseStrTime(Test.date2) - Test.parseStrTime(Test.date1);
    long oneDaylong = 24*60*60*1000;
    long dayNum = longNum/oneDaylong;
    System.out.println("相差的天数:" + dayNum);
    System.out.println("相差的月数:" + dayNum/30);
}

运行结果:
相差的天数:333
相差的月数:11

[b]下面这段代码应该能解决你的问题[/b]
[code="java"]
package com.ebiz.framework.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class test
{
public static String BEFORE = "-"; //减少天数
public static String AFTER = "+"; //增加天数

/**
 * 取得相隔数量的【日或者月】的日期
 * @param date      指定日期
 * @param type      BEFORE:往前,AFTER:往后
 * @param interval  相隔的日或者月,格式为 14D/12M【相隔14日/相隔12月】
 */
public static Date getIntervalDate(Date date,String type,String intervalString){     
    try {
        int interval = Integer.valueOf(intervalString.substring(0, intervalString.length() - 1));
        String dayOrMonth = intervalString.substring(intervalString.length() - 1);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date); 
        if ("S".equals(dayOrMonth.toUpperCase()))
        {
            if (test.BEFORE.equals(type)) cal.add(Calendar.SECOND, -interval);
            if (test.AFTER.equals(type))  cal.add(Calendar.SECOND, +interval);
        }
        else if ("I".equals(dayOrMonth.toUpperCase()))
        {
            if (test.BEFORE.equals(type)) cal.add(Calendar.MINUTE, -interval);
            if (test.AFTER.equals(type))  cal.add(Calendar.MINUTE, +interval);
        }
        else if ("H".equals(dayOrMonth.toUpperCase()))
        {
            if (test.BEFORE.equals(type)) cal.add(Calendar.HOUR, -interval);
            if (test.AFTER.equals(type))  cal.add(Calendar.HOUR, +interval);
        }
        else if ("D".equals(dayOrMonth.toUpperCase()))
        {
            if (test.BEFORE.equals(type)) cal.add(Calendar.DATE, -interval);
            if (test.AFTER.equals(type))  cal.add(Calendar.DATE, +interval);
        }
        else if ("M".equals(dayOrMonth.toUpperCase())){
            if (test.BEFORE.equals(type)) cal.add(Calendar.MONTH, -interval);
            if (test.AFTER.equals(type))  cal.add(Calendar.MONTH, +interval);
        }
        else if ("Y".equals(dayOrMonth.toUpperCase())){
            if (test.BEFORE.equals(type)) cal.add(Calendar.YEAR, -interval);
            if (test.AFTER.equals(type))  cal.add(Calendar.YEAR, +interval);
        }
        return cal.getTime();
    }
    catch (Exception e) 
    {
        return null;
    }
}
public static void main(String[] main)
{
    for(int i = 1;i<=6; i++)
    {
        System.out.println(new SimpleDateFormat("M").format(getIntervalDate(new Date(),"-",i+"m"))+"月");
    }
}

}
[code="java"][/code]
[/code]

new DateCalculate().calculate("2014-01-28", "2014-3-01"); 二月好像处理不了