算法:先把两个日期转化为毫秒,再相减,最后除以一天的毫秒数,查API都有方法的

解决方案 »

  1.   

    import java.text.ParseException;
    import java.util.Calendar;
    import java.util.Date;/*
     * Created on 2006-8-11
     *
     *//**
     * @author zhuzf
     *
     */
    public class DateUtil {
        // 定义比较日期的类型
        public final static int ERROR = -1000;
        public final static int ON_DAY = 1;
        public final static int ON_MONTH = 2;
        public final static int ON_YEAR = 3;
        public final static int ON_HOUR = 4;
        public final static int ON_MINUTE = 5;
        public final static int ON_SECOND = 6;
        public final static int ON_SYSTEM = 7;    // 定义日期常量
        public final static int YEAR_MONTHS = 12;
        public final static int DAY_HOURS = 24;
        public final static int HOUR_MINUTES = 60;
        public final static int MINUTE_SECONDS = 60;    
        /**
         * 根据比较深度来比较两个日期,并且按比较深度返回d1-d2
         *
         * @param d1    Date
         * @param d2    Date
         * @param scope int 比较级别
         * @return long
         */
        public static long compareDate(Date d1, Date d2, int scope) {
          switch (scope) {
            case ON_YEAR:
              return compareDateOnYear(d1, d2);
            case ON_MONTH:
              return compareDateOnMonth(d1, d2);
            case ON_DAY:
              return compareDateOnDay(d1, d2);
            case ON_HOUR:
              return compareDateOnHour(d1, d2);
            case ON_MINUTE:
              return compareDateOnMinute(d1, d2);
            case ON_SECOND:
              return compareDateOnSecond(d1, d2);
            case ON_SYSTEM:
              return compareDateOnSystem(d1, d2);
            default:
              return ERROR;
          }
        }
            /**
         * 比较两个日期的年份差距
         *
         * @param d1 Date
         * @param d2 Date
         * @return int
         */
        public static int compareDateOnYear(Date d1, Date d2) {
          Calendar c1 = Calendar.getInstance();
          Calendar c2 = Calendar.getInstance();
          c1.setTime(d1);
          c2.setTime(d2);
          int y1 = c1.get(Calendar.YEAR);
          int y2 = c2.get(Calendar.YEAR);
          return y1 - y2;
        }    /**
         * 比较两个日期在月份上的差距
         *
         * @param d1 Date
         * @param d2 Date
         * @return int
         */
        public static int compareDateOnMonth(Date d1, Date d2) {
          if (d1.getTime() == d2.getTime()) {
            return 0; // 日期相同返回0
          }
          int flag = -1;
          // 比较两个日期使日期较小的日期排在前面
          if (d1.getTime() > d2.getTime()) { // 日期一在日期二之后
            Date temp = d1;
            d1 = d2;
            d2 = temp;
            flag = 1;
          }
          Calendar c1 = Calendar.getInstance();
          Calendar c2 = Calendar.getInstance();
          c1.setTime(d1);
          c2.setTime(d2);
          int y1 = c1.get(Calendar.YEAR);
          int y2 = c2.get(Calendar.YEAR);
          int mon1 = c1.get(Calendar.MONTH);
          int mon2 = c2.get(Calendar.MONTH);
          int mons = 0;
          for (int i = 1; i <= y2 - y1; i++) {
            mons += YEAR_MONTHS; // 一年有12个月
          }
          return (mons - mon1 + mon2) * flag;
        }    /**
         * 比较两个日期并返回两个日期相差多少天(d1-d2)
         *
         * @param d1 Date
         * @param d2 Date
         * @return int
         */
        public static int compareDateOnDay(Date d1, Date d2) {
          if (d1.getTime() == d2.getTime()) {
            return 0; // 日期相同返回0
          }
          int flag = -1;
          // 比较两个日期使日期较小的日期排在前面
          if (d1.getTime() > d2.getTime()) { // 日期一在日期二之后
            Date temp = d1;
            d1 = d2;
            d2 = temp;
            flag = 1;
          }
          Calendar c1 = Calendar.getInstance();
          Calendar c2 = Calendar.getInstance();
          c1.setTime(d1);
          c2.setTime(d2);
          int y1 = c1.get(Calendar.YEAR);
          int y2 = c2.get(Calendar.YEAR);
          int day1 = c1.get(Calendar.DAY_OF_YEAR);
          int day2 = c2.get(Calendar.DAY_OF_YEAR);
          int days = 0;
          for (int i = 1; i <= y2 - y1; i++) {
            days += getYearDays(y1);
          }
          return (days - day1 + day2) * flag;
        }
      

  2.   


        public static long compareDateOnHour(Date d1, Date d2) {
          if (d1.getTime() == d2.getTime()) {
            return 0; // 日期相同返回0
          }
          int flag = -1; // d1<d2
          // 比较两个日期使日期较小的日期排在前面
          if (d1.getTime() > d2.getTime()) { // 日期一在日期二之后
            Date temp = d1;
            d1 = d2;
            d2 = temp;
            flag = 1;
          }
          Calendar c1 = Calendar.getInstance();
          Calendar c2 = Calendar.getInstance();
          c1.setTime(d1);
          c2.setTime(d2);
          int y1 = c1.get(Calendar.YEAR);
          int y2 = c2.get(Calendar.YEAR);
          int day1 = c1.get(Calendar.DAY_OF_YEAR);
          int day2 = c2.get(Calendar.DAY_OF_YEAR);
          int days = 0;
          for (int i = 1; i <= y2 - y1; i++) {
            days += getYearDays(y1);
          }
          days = (days - day1 + day2);
          int h1 = c1.get(Calendar.HOUR_OF_DAY);
          int h2 = c2.get(Calendar.HOUR_OF_DAY);
          return (days * DAY_HOURS - h1 + h2) * flag;
        }    public static long compareDateOnMinute(Date d1, Date d2) {
          if (d1.getTime() == d2.getTime()) {
            return 0; // 日期相同返回0
          }
          int flag = -1; // d1<d2
          // 比较两个日期使日期较小的日期排在前面
          if (d1.getTime() > d2.getTime()) { // 日期一在日期二之后
            Date temp = d1;
            d1 = d2;
            d2 = temp;
            flag = 1;
          }
          Calendar c1 = Calendar.getInstance();
          Calendar c2 = Calendar.getInstance();
          c1.setTime(d1);
          c2.setTime(d2);
          int y1 = c1.get(Calendar.YEAR);
          int y2 = c2.get(Calendar.YEAR);
          int day1 = c1.get(Calendar.DAY_OF_YEAR);
          int day2 = c2.get(Calendar.DAY_OF_YEAR);
          int days = 0;
          for (int i = 1; i <= y2 - y1; i++) {
            days += getYearDays(y1);
          }
          days = (days - day1 + day2);
          int h1 = c1.get(Calendar.HOUR_OF_DAY);
          int h2 = c2.get(Calendar.HOUR_OF_DAY);
          long hours = days * DAY_HOURS - h1 + h2;
          int m1 = c1.get(Calendar.MINUTE);
          int m2 = c2.get(Calendar.MINUTE);
          return (hours * HOUR_MINUTES - m1 + m2) * flag;
        }    public static long compareDateOnSecond(Date d1, Date d2) {
          if (d1.getTime() == d2.getTime()) {
            return 0; // 日期相同返回0
          }
          int flag = -1; // d1<d2
          // 比较两个日期使日期较小的日期排在前面
          if (d1.getTime() > d2.getTime()) { // 日期一在日期二之后
            Date temp = d1;
            d1 = d2;
            d2 = temp;
            flag = 1;
          }
          Calendar c1 = Calendar.getInstance();
          Calendar c2 = Calendar.getInstance();
          c1.setTime(d1);
          c2.setTime(d2);
          int y1 = c1.get(Calendar.YEAR);
          int y2 = c2.get(Calendar.YEAR);
          int day1 = c1.get(Calendar.DAY_OF_YEAR);
          int day2 = c2.get(Calendar.DAY_OF_YEAR);
          int days = 0;
          for (int i = 1; i <= y2 - y1; i++) {
            days += getYearDays(y1);
          }
          days = (days - day1 + day2);
          int h1 = c1.get(Calendar.HOUR_OF_DAY);
          int h2 = c2.get(Calendar.HOUR_OF_DAY);
          long hours = days * DAY_HOURS - h1 + h2;
          int m1 = c1.get(Calendar.MINUTE);
          int m2 = c2.get(Calendar.MINUTE);
          long minutes = hours * HOUR_MINUTES - m1 + m2;
          int s1 = c1.get(Calendar.SECOND);
          int s2 = c2.get(Calendar.SECOND);
          return (minutes * MINUTE_SECONDS - s1 + s2) * flag;
        }  
        public static int compareDateOnSystem(Date d1, Date d2) {
            return (int) (d1.getTime() - d2.getTime());
          }
        /**
         * 自己编写的判断闰年的方法
         *
         * @param year int 年份
         * @return boolean(true=闰年,false=非闰年)
         */
        public static boolean isLeapYear(int year) {
          if ( (year % 400 == 0) || ( (year % 4 == 0) && (year % 100 != 0))) {
            return true;
          }
          return false;
        }    /**
         * 自己编写的得到一年的天数的方法
         *
         * @param year int 年份
         * @return int (非闰年=365,闰年=366)
         */
        public static int getYearDays(int year) {
          if (isLeapYear(year)) {
            return 366;
          }
          return 365;
        } 
        /**
         * 将一个字符串格式化为一个java.util.Date对象 
         *
         * @param obj Object
         * @return Date
         */
        public static Date parse(Object obj) {
          try {
            if (obj == null) {
              return null;
            }
            String dateString = obj.toString().trim();
            if (dateString.length() == 0) {
              return null;
            }
            if (dateString.length() == 10) {
              dateString += " 00:00:00";
            }
            java.text.DateFormat df = new java.text.SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
            return df.parse(dateString);
          }
          catch (ParseException ex) {
            ex.printStackTrace();
            return null;
          }    }    
        public static void main(String[] args){
            System.out.println("2005-08-07 到 2006-01-02 相差 "+compareDate(parse("2006-01-02"),parse("2005-08-07"),DateUtil.ON_DAY)+" 天");
        }
        
    }