网上去找了些代码看看都不满意,比如2010 2 28 和 2010 3 1之间的天数应该是只是一天,2010是闰年
而以下三段代码都错的出来是4天import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Main {
    public static int getIntervalDays(Date startday,Date endday){       
        if(startday.after(endday)){
            Date cal=startday;
            startday=endday;
            endday=cal;
        }       
        long sl=startday.getTime();
        long el=endday.getTime();      
        long ei=el-sl;          
        return (int)(ei/(1000*60*60*24));
    } 
public static void main(String[] args) throws ParseException {
Date d1 = new Date(2010,2,28);
Date d2 = new Date(2010,3,1);
System.out.println(getIntervalDays(d1,d2));
}
}import java.util.Calendar;public class Main {
public static int getIntervalDays(Calendar startday, Calendar endday) {
if (startday.after(endday)) {
Calendar cal = startday;
startday = endday;
endday = cal;
}
long sl = startday.getTimeInMillis();
long el = endday.getTimeInMillis(); long ei = el - sl;
return (int) (ei / (1000 * 60 * 60 * 24));
} public static void main(String[] args) {
Calendar cal1 = Calendar.getInstance();
cal1.set(2010, 2, 28);
Calendar cal2 = Calendar.getInstance();
cal2.set(2010, 3, 1);
System.out.println(getIntervalDays(cal1,cal2));
}
}import java.util.Calendar;public class Main {
public static int getDaysBetween (Calendar d1, Calendar d2){
        if (d1.after(d2)) {
            java.util.Calendar swap = d1;
            d1 = d2;
            d2 = swap;
        }
        int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
        int y2 = d2.get(Calendar.YEAR);
        if (d1.get(Calendar.YEAR) != y2) {
            d1 = (Calendar) d1.clone();
            do {
                days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);//得到当年的实际天数
                d1.add(Calendar.YEAR, 1);
            } while (d1.get(Calendar.YEAR) != y2);
        }
        return days;
    }  public static void main(String[] args) {
Calendar cal1 = Calendar.getInstance();
cal1.set(2010, 2, 28);
Calendar cal2 = Calendar.getInstance();
cal2.set(2010, 3, 1);
System.out.println(getDaysBetween(cal1, cal2));
}
}
请问,java有有比较好的解决这个闰年问题吗?是要自己写方法判断,还是有现成的方法精确的计算两个日期之间的天数?
请路过大牛不吝赐教,谢谢~

解决方案 »

  1.   

    joda-timeDateTime d1 = new DateTime(2010,2,28,0,0,0,0);
    DateTime d2 = new DateTime(2010,3,1,0,0,0,0);
    System.out.println(Days.daysBetween(d1,d2).getDays()); // 1
      

  2.   

    package test;
    import java.text.ParseException;
    import java.sql.Date;
    public class Main {
        public static int getIntervalDays(Date startday,Date endday){       
            if(startday.after(endday)){
                Date cal=startday;
                startday=endday;
                endday=cal;
            }       
            long sl=startday.getTime();
            long el=endday.getTime();      
            long ei=el-sl;          
            return (int)(ei/(1000*60*60*24));
        } 
        public static void main(String[] args) throws ParseException {
            Date d1 = Date.valueOf("2010-02-28");
            Date d2 = Date.valueOf("2010-03-01");
            System.out.println(getIntervalDays(d1,d2));
        }
    }
    用java.sql.Date吧,你用的那个创建日期的方法都废弃了!
      

  3.   


    public static void main(String[] args)
      {
      //Date date = new Date();
      String strDateStart = "2009-6-10";  
      String strDateEnd = "2010-6-10";    try{  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Date dateStart = sdf.parse(strDateStart );
      Date dateEnd = sdf.parse(strDateEnd );
      
      System.out.println((dateEnd .getTime()- dateStart .getTime())/86400000);  }catch(Exception ex){
      ex.printStackTrace();
      }   
      }
      

  4.   

    楼主有一件事情要搞清楚
    0表示1月,1表示2月
    所以:
    Calendar c1 = new GregorianCalendar(2010,1,28);//表示2010年2月28日
    Calendar c2 = new GregorianCalendar(2010,2,1);//2010-3-1
    System.out.println(c2.get(Calendar.DAY_OF_YEAR)-c1.get(Calendar.DAY_OF_YEAR));
      

  5.   

    为什么这种方法创建的日期然后相减(2010-2-28  2010-3-1) 结果是1
    但 用Date d = new Date(2010,2,28) 这种就是错的呢?
    我getTime输出 发现两个时间对应的长整型都不一样,为什么?
      

  6.   

    对的,0表示1月,1表示2月,java当中的是这样,js当中的日期也是一样的
      

  7.   

    /**
         * Allocates a <code>Date</code> object and initializes it so that 
         * it represents midnight, local time, at the beginning of the day 
         * specified by the <code>year</code>, <code>month</code>, and 
         * <code>date</code> arguments. 
         *
         * @param   year    the year minus 1900.
         * @param   month   the month between 0-11.
         * @param   date    the day of the month between 1-31.
         * @see     java.util.Calendar
         * @deprecated As of JDK version 1.1,
         * replaced by <code>Calendar.set(year + 1900, month, date)</code>
         * or <code>GregorianCalendar(year + 1900, month, date)</code>.
         */
        @Deprecated
        public Date(int year, int month, int date) {
            this(year, month, date, 0, 0, 0);
        }
    话说,有些东西源码上写的很清楚……这个构造方法已经被废弃了,即使要用你也应该写new Date(110, 1, 28)来表示2010年2月28日……
      

  8.   

    public class Test {
    public static void main(String[] args) throws ParseException {
    Date b = DateFormat.getDateInstance().parse("2010-2-28");
    Date e = DateFormat.getDateInstance().parse("2010-3-1");
    System.out.println(ff(b, e));  // 1
    } public static long ff(Date bDate, Date eDate) {
    if (bDate == null || eDate == null)
    return 0L;
    return (eDate.getTime() - bDate.getTime()) / (1000 * 3600 * 24);
    }
    }
      

  9.   

    Calendar now = Calendar.getInstance();
    System.out.println(((GregorianCalendar)now).isLeapYear(2010));2010不是闰年吧。