package com.haier.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 功能:对日期操作的公共方法类 作者:高鹏 * */ public class DateUtil { /*** * 格式化日期的方法 * * @param date * 带格式化的日期 * @param pattern * 格式化的表达式 比如 yyyy-MM-dd * @return 格式化后的字符串 */ public static String formatDate(Date date, String pattern) { // 建立日期FORMAT的实例 SimpleDateFormat df = new SimpleDateFormat(pattern); return df.format(date); } /*** * 格式化日期的方法 * * @param date * 带格式化的日期,默认为yyyy-MM-dd * @return 格式化后的字符串 */ public static String formatDate(Date date) { return formatDate(date, "yyyy-MM-dd"); } /** * 利用传入的日期,返回上一个月当天的日期对象 * * @param current * :当前日期对象 * @return 上一个月的当天的日期对象 */ public static Date getPreviousMonth(Date current) { if (current.getMonth() != 1) { // 如果不是一月份,则直接减去一天 return new Date(current.getYear(), current.getMonth() - 1, current.getDate()); } else { // 如果是一月份,则需要在年上减去一天,月变为12 return new Date(current.getYear() - 1, 12, current.getDate()); } } /** * 利用传入的日期,返回上一个月当天的日期对象 * * @param current * :当前日期对象 * @return 上一个月的当天的日期对象 */ public static Date getNextMonth(Date current) { if (current.getMonth() != 12) { // 如果不是一月份,则直接减去一天 return new Date(current.getYear(), current.getMonth() + 1, current.getDate()); } else { // 如果是一月份,则需要在年上减去一天,月变为12 return new Date(current.getYear() + 1, 0, current.getDate()); } } /** 利用传入日期,返回一个上个月日期的yyyyMM的String表达式 */ public static String getPreviousMonths(Date current) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); return sdf.format(getPreviousMonth(current)); } /*** * 获取传入日期下一年的日期对象 * * @param date * 传入的日期对象 * @return 下一年的日期对象 */ public static Date getNextYear(Date date) { return new Date(date.getYear() + 1, date.getMonth(), date.getDate()); } /*** * 获取传入日期下n年的日期对象 * * @param date * 传入的日期对象 * @return 下n年的日期对象 */ public static Date getNextNYear(Date date, int n) { return new Date(date.getYear() + n, date.getMonth(), date.getDate()); } /*** * 计算传入日期的往后顺延N天以后的日期对象 * * @param date * 传入的日期对象 * @param n * 往后顺延的天数 * @return 顺延后的日期对象 */ public static Date getPreviousNDate(Date date, long n) { long time = date.getTime(); // 用毫秒数来计算新的日期 time = time - n * 24 * 60 * 60 * 1000; return new Date(time); } /*** * 计算传入日期的往前推算N天的日期对象 * * @param date * 传入的日期对象 * @param n * 往后顺延的天数 * @return 往前推算后的日期对象 */ public static Date getNextNDate(Date date, long n) { long time = date.getTime(); // 用毫秒数来计算新的日期 time = time + n * 24 * 60 * 60 * 1000; return new Date(time); } /*** * 计算传入日期的前一天 * * @param date * 传入日期 * @return 传入日期的前一天的日期对象 */ public static Date getPreviousDate(Date date) { return getPreviousNDate(date, 1); } /*** * 计算传入日期的后一天 * * @param date * 传入日期 * @return 传入日期的后一天的日期对象 */ public static Date getNextDate(Date date) { return getNextNDate(date, 1); } /** * 日期转换成字符串 * * @作者:滑立敏 * @日期:2010-01-26 * @param date * @return str */ public static String dateToStr(Date date) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String str = format.format(date); return str; } /** * 字符串转换成日期 * * @作者:滑立敏 * @日期:2010-01-26 * @param str * @return date */ public static Date strToDate(String str) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = format.parse(str); } catch (ParseException e) { e.printStackTrace(); } return date; } /** * 根据传入的日期计算此日期与下一年该日相差的天数 * * @param startDate * 起始日期 * @return 天数区间 * * @作者:李阳 * @时间:2010-06-22 */ public static int getDaysCountForYear(Date startDate) { // 获取传入日期下一年的日期对象 Date nextYear = getNextYear(startDate); // 计算天数 return getDaysCount(startDate, nextYear); } /*** * 根据起始日期、终止日期计算天数 * * @param startDate * 起始日期 * @param endDate * 终止日期 * @return 天数区间 */ public static int getDaysCount(Date startDate, Date endDate) { return getDaysCount(startDate, 0, endDate, 0); } /*** * 根据年数返回所包含的天数 * * @param year * 年数 * @return 该年所包含的天数 */ public static int getDaysFromYear(int year) { // 判断是平年还是闰年 if ((year % 400 == 0) || (year % 100 != 0) && (year % 4 == 0)) { return 366; } else return 365; } /*** * 根据起始日期、起始时间、终止日期、终止时间计算天数 * * @param startDate * 起始日期 * @param startHour * 起始小时 * @param endDate * 终止日期 * @param endHour * 终止小时 * @return 天数区间 */ public static int getDaysCount(Date startDate, int startHour, Date endDate, int endHour) { // 根据起始日期计算起始的毫秒 long startTime = startDate.getTime(); // 根据终止日期计算终止的毫秒 long endTime = endDate.getTime(); // 通过起始毫秒和终止毫秒的差值,计算天数 int dayCount = (int) ((endTime - startTime) / (24 * 60 * 60 * 1000) + 1); if (endHour <= startHour) { if (startHour == 24 && endHour == 0) { dayCount = dayCount - 2; } else { dayCount = dayCount - 1; } } return dayCount; } /*** * 根据起始日期、终止日期计算月数 * * @param startDate * 起始日期 * @param endDate * 终止日期 * @return 天数区间 */ public static int getMonthsCount(Date startDate, Date endDate) { return getMonthsCount(startDate, 0, endDate, 0); } /*** * 根据起始日期、起始时间、终止日期、终止时间计算天数 * * @param startDate * 起始日期 * @param startHour * 起始小时 * @param endDate * 终止日期 * @param endHour * 终止小时 * @return 天数区间 */ public static int getMonthsCount(Date startDate, int startHour, Date endDate, int endHour) { // 年份差 int yearDiff = endDate.getYear() - startDate.getYear(); // 月份差 int monthDiff = endDate.getMonth() - startDate.getMonth(); // 总的月数量 int monthCount = monthDiff + yearDiff * 12; // 天数差 long dayDiff = endDate.getDate() - startDate.getDate(); // 不足一个月按一个月计算 if (dayDiff > 0 || (dayDiff == 0 && endHour > startHour)) { monthCount = monthCount + 1; } return monthCount; } /*** * 获取当前年份 * * @return 当前年份 * @author sunjiuhua 20110908 */ public static int getCurrentYear() { return Integer.parseInt(new SimpleDateFormat("yyyy").format(System .currentTimeMillis())); } /*** * 根据日期获得年份 * * @return 年份 * @author sunjiuhua 20110908 */ public static int getYear(Date date) { return Integer.parseInt(new SimpleDateFormat("yyyy").format(date)); } /*** * 根据日期获得月份 * * @return 月份 * @author sunjiuhua 20111019 */ public static int getMonth(Date date) { return Integer.parseInt(new SimpleDateFormat("MM").format(date)); } /*** * 根据日期获得日份 * * @return 日份 * @author sunjiuhua 20111019 */ public static int getDay(Date date) { return Integer.parseInt(new SimpleDateFormat("dd").format(date)); } /*** * 根据起始日期、终止日期计算年数 * * @param startDate * 起始日期 * @param endDate * 终止日期 * @return 天数区间 */ public static int getYearsCount(Date startDate, Date endDate) { return getYearsCount(startDate, 0, endDate, 0); } /*** * 根据起始日期、起始时间、终止日期、终止时间计算天数 * * @param startDate * 起始日期 * @param startHour * 起始小时 * @param endDate * 终止日期 * @param endHour * 终止小时 * @return 天数区间 */ public static int getYearsCount(Date startDate, int startHour, Date endDate, int endHour) { int yearCount = 0; // 获取之间的月数 int monthCount = getMonthsCount(startDate, startHour, endDate, endHour); yearCount = monthCount / 12; if (monthCount % 12 != 0) { yearCount++; } // 返回年数 return yearCount; } /** * 根据日期获取总小时数 * * @param date * 日期对象 * @return 总小时数 */ public static int getHoursCount(Date date) { return getHoursCount(date, 0); } /** * 根据日期和小时数,获取总小时数 * * @param date * 日期对象 * @param hour * 小时数 * @return 总小时数 */ public static int getHoursCount(Date date, Integer hour) { long hourCount = hour; hourCount += date.getTime() / 3600 / 1000; return (int) hourCount; } /*** * 比较两个日期的大小 * * @param startDate * 开始日期 * @param endDate * 结束日期 * @return -1 : 开始日期小于结束日期 0 : 开始日期等于结束日期 1 : 开始日期大于结束日期 */ public static int compareDate(Date startDate, Date endDate) { long startTime = startDate.getTime(); long endTime = endDate.getTime(); if (startTime < endTime) { return -1; } if (startTime == endTime) { return 0; } return 1; } /*** * 比较两个日期的大小 * * @param startDate * 开始日期 * @param endDate * 结束日期 * @return -1 : 开始日期小于结束日期 0 : 开始日期等于结束日期 1 : 开始日期大于结束日期 */ public static int compareDate(String startDate, String endDate) { return compareDate(strToDate(startDate), strToDate(endDate)); } /*** * 比较一个日期是否在某一个日期范围之内 * * @param startDate * 开始日期 * @param endDate * 结束日期 * @return -1 : 不在时间范围之内 1 : 在时间范围之内 */ public static int compareDate(String startDate, String endDate, String date){ int i = compareDate(strToDate(startDate), strToDate(date)); int j = compareDate(strToDate(endDate), strToDate(date)); if((i == -1 || i == 0) && (j == 1 || j == 0)){ return 1; } return -1; } /*** * 根据起始日期、起始时间、终止日期、终止时间计算月数,计算的是去掉多余天数的月数 * * 作者:刘立伟 时间:2010-10-20 * * @param startDate * 起始日期 * @param startHour * 起始小时 * @param endDate * 终止日期 * @param endHour * 终止小时 * @return 期间相差的月数(去掉多余的天数) */ public static int getMinMonthsCount(Date startDate, int startHour, Date endDate, int endHour) { // 年份差 int yearDiff = endDate.getYear() - startDate.getYear(); // 月份差 int monthDiff = endDate.getMonth() - startDate.getMonth(); // 总的月数量 int monthCount = monthDiff + yearDiff * 12; // 天数差 long dayDiff = endDate.getDate() - startDate.getDate(); // 如果天数差小于0或者天数差等于零(并且终止小时小于起始小时),那么月数减一。 if (dayDiff < 0 || (dayDiff == 0 && endHour < startHour)) { monthCount = monthCount - 1; } return monthCount; } /*** * 根据起始日期、起始时间、终止日期、终止时间计算天数,计算的是相差月后余下的天数 * * @param startDate * 起始日期 * @param startHour * 起始小时 * @param endDate * 终止日期 * @param endHour * 终止小时 * @return 余下的天数 * * 作者:刘立伟 时间:2010-10-20 */ public static int getOtherDayCount(Date startDate, int startHour, Date endDate, int endHour) { // 相差的天数 int dayCount = 0; // 时间变量 long newStartTime = 0; // 终保日期getTime变量 long endTime = 0; // 计算日相差 int dayDiff = endDate.getDate() - startDate.getDate(); // 如果日相差等于0,那endHour > startHour,那么返回一天,如:2010-10-10:02到2010-10-10:09 if (dayDiff == 0) { if (endHour > startHour) { return 1; } // 如果日相差小于0 } else if (dayDiff < 0) { // 如果startHour < endHour,如:2010-09-18:02------2010-10-10:08 if (startHour < endHour) { Date newStartDate = new Date(endDate.getYear(), endDate.getMonth() - 1, startDate.getDate()); newStartTime = newStartDate.getTime(); endTime = endDate.getTime(); dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000) + 1); // 如果startHour = endHour,如:2010-09-18:02------2010-10-10:02 } else if (startHour == endHour) { Date newStartDate = new Date(endDate.getYear(), endDate.getMonth() - 1, startDate.getDate()); newStartTime = newStartDate.getTime(); endTime = endDate.getTime(); dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000)); // 如果startHour > endHour } else if (startHour > endHour) { Date newStartDate = new Date(endDate.getYear(), endDate.getMonth() - 1, startDate.getDate()); newStartTime = newStartDate.getTime(); endTime = endDate.getTime(); dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000) + 1); // 如:2010-09-18:24------2010-10-10:00 if (startHour == 24 && endHour == 0) { dayCount = dayCount - 2; // 如:2010-09-18:14------2010-10-10:10 } else { dayCount = dayCount - 1; } } // 日相差大于0 } else if (dayDiff > 0) { // 如果startHour < endHour if (startHour > endHour) { Date newStartDate = new Date(endDate.getYear(), endDate.getMonth(), startDate.getDate()); newStartTime = newStartDate.getTime(); endTime = endDate.getTime(); // 如:2010-10-10:08------2010-10-18:02 dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000)); // 如:2010-10-10:24------2010-10-18:00 if (startHour == 24 && endHour == 0) { dayCount = dayCount - 1; } // 如果startHour = endHour,如:2010-10-10:08------2010-10-18:08 } else if (startHour == endHour) { Date newStartDate = new Date(endDate.getYear(), endDate.getMonth(), startDate.getDate()); newStartTime = newStartDate.getTime(); endTime = endDate.getTime(); dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000)); // 如果startHour < endHour,如:2010-10-10:02------2010-10-18:08 } else if (startHour < endHour) { Date newStartDate = new Date(endDate.getYear(), endDate.getMonth(), startDate.getDate()); newStartTime = newStartDate.getTime(); endTime = endDate.getTime(); dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000) + 1); } } return dayCount; } /*** * 根据起始日期、起始时间、终止日期、终止时间计算天数,计算的是相差月后余下的天数 * * @param startDate * 起始日期 * @param startHour * 起始小时 * @param endDate * 终止日期 * @param endHour * 终止小时 * @return 余下的天数 * * 作者:孙久华 时间:2012-05-23 */ public static int getOtherDays(Date startDate, int startHour, Date endDate, int endHour) { Calendar scl = Calendar.getInstance(); scl.setTime(startDate); Calendar ecl = Calendar.getInstance(); ecl.setTime(endDate); int startday = scl.get(Calendar.DAY_OF_MONTH); int endYear = ecl.get(Calendar.YEAR); int endMonth = ecl.get(Calendar.MONTH) + 1; int endday = ecl.get(Calendar.DAY_OF_MONTH); // 相差的天数 int dayCount = 0; // 时间变量 long newStartTime = 0; // 终保日期getTime变量 long endTime = 0; // 计算日相差 int dayDiff = endday - startday; // 如果日相差等于0,那endHour > startHour,那么返回一天,如:2010-10-10:02到2010-10-10:09 if (dayDiff == 0) { if (endHour > startHour) { return 1; } // 如果日相差小于0 } else if (dayDiff < 0) { scl.set(endYear, endMonth - 2, startday); newStartTime = scl.getTimeInMillis(); endTime = ecl.getTimeInMillis(); // 如果startHour < endHour,如:2010-09-18:02------2010-10-10:08 if (startHour < endHour) { dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000) + 1); // 如果startHour = endHour,如:2010-09-18:02------2010-10-10:02 } else if (startHour == endHour) { dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000)); // 如果startHour > endHour } else if (startHour > endHour) { dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000) + 1); // 如:2010-09-18:24------2010-10-10:00 if (startHour == 24 && endHour == 0) { dayCount = dayCount - 2; // 如:2010-09-18:14------2010-10-10:10 } else { dayCount = dayCount - 1; } } // 去除最后一个月的天数 if (endMonth == 5 || endMonth == 7 || endMonth == 10 || endMonth == 12) { dayCount = dayCount % 30; } else if (endMonth == 1 || endMonth == 2 || endMonth == 4 || endMonth == 6 || endMonth == 8 || endMonth == 9 || endMonth == 11) { dayCount = dayCount % 31; } else if (endMonth == 3 && endYear % 4 == 0 && endYear % 10 != 0) { if (startday > 29) { dayCount = dayCount % 31; } else { dayCount = dayCount % 29; } } else if (endMonth == 3) { if (startday > 28) { dayCount = dayCount % 31; } else { dayCount = dayCount % 28; } } // 日相差大于0 } else if (dayDiff > 0) { scl.set(endYear, endMonth - 1, startday); newStartTime = scl.getTimeInMillis(); endTime = ecl.getTimeInMillis(); // 如果startHour < endHour if (startHour > endHour) { // 如:2010-10-10:08------2010-10-18:02 dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000)); // 如:2010-10-10:24------2010-10-18:00 if (startHour == 24 && endHour == 0) { dayCount = dayCount - 1; } // 如果startHour = endHour,如:2010-10-10:08------2010-10-18:08 } else if (startHour == endHour) { dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000)); // 如果startHour < endHour,如:2010-10-10:02------2010-10-18:08 } else if (startHour < endHour) { dayCount = (int) ((endTime - newStartTime) / (24 * 60 * 60 * 1000) + 1); } // 去除最后一个月的天数 if (endMonth == 1 || endMonth == 3 || endMonth == 5 || endMonth == 7 || endMonth == 8 || endMonth == 10 || endMonth == 12) { dayCount = dayCount % 31; } else if (endMonth == 4 || endMonth == 6 || endMonth == 9 || endMonth == 11) { dayCount = dayCount % 30; } else if (endMonth == 2 && endYear % 4 == 0 && endYear % 10 != 0) { dayCount = dayCount % 29; } else if (endMonth == 2) { dayCount = dayCount % 28; } } return dayCount; } /** * add by gaopeng 2012-10-26 reason: 根据日期区间判断其中是否包含2月29日,决定保费计算,一年取366还是365。 * * @param date1 * -- 起始日期 * @param date2 * -- 终止日期 * @param hour1 * -- 起始小时 * @param hour2 * -- 终止小时 * @return */ public static Boolean getOneYearDays(Date date1, Date date2, int hour1, int hour2) { long time = date1.getTime(); Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); c1.setTime(date1); c2.setTime(date2); /** 获取2个日期间的年数 begin */ int year = getYearsCount(date1, hour1, date2, hour2); year = year - 1;// 获取n-1年后剩余的天数,进行计算 c1.add(Calendar.YEAR, year); // System.out.println(formatDate(c1.getTime())); /** 获取2个日期间的年数 end */ // 判断2个日期间是否存在2月29日 while (c1.compareTo(c2) <= 0) { if (c1.get(Calendar.MONTH) + 1 == 2 && c1.get(Calendar.DATE) == 29) { if (c1.compareTo(c2) == 0 && hour2 == 0) { int month = c1.get(Calendar.MONTH) + 1; System.out.println("2月29日0时,没有夸闰年:" + c1.get(Calendar.YEAR) + "-" + month + "-" + c1.get(Calendar.DATE)); return false; } else { int month = c1.get(Calendar.MONTH) + 1; System.out.println("闰年:" + c1.get(Calendar.YEAR) + "-" + month + "-" + c1.get(Calendar.DATE)); return true; } } c1.add(Calendar.DATE, 1); } return false; } /** * 获取一个月有多少天 * @param str * @return */ public static Integer getDaysOfMonth(String str) { Calendar rightNow = Calendar.getInstance(); SimpleDateFormat simpleDate = new SimpleDateFormat("yyyyMM"); try { rightNow.setTime(simpleDate.parse(str)); } catch (ParseException e) { e.printStackTrace(); } int days = rightNow.getActualMaximum(Calendar.DAY_OF_MONTH); return days; } /** * 获取当前日期是星期几 * @param str * @return * @throws Exception */ public static int getDateWeek(String str) throws Exception{ Date date = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd"); date = df.parse(str); return date.getDay(); } public static void main(String[] args) { try { getDaysOfMonth("2010-12"); System.out .println(getDateWeek("2014/04/26")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // getOneYearDays(strToDate("2010-12-05"),strToDate("2012-12-04"),0,24) // getYearsCount(strToDate("2010-12-05"),0,strToDate("2011-12-04"),0) // System.out.println(formatDate(date, "yyyy-MM-dd")); // System.out.println(getHoursCount(strToDate("2010-12-05"))); // System.out.println(getHoursCount(strToDate("2010-12-06"))); System.out.println(2%5); } }