分享:Java日期工具类
平常开发中积累了一些,可能会和其他有重复,发上来按需取舍 包括:日期格式化、日期相加、日期排序等 因为在项目中要对一组无序日期排序并分组就写了一个方法,
/** * 日期分组
* 能够对指定日期列表按照连续性分组
* 例如:[2010-01-15, 2010-01-16, 2010-01-17, 2010-01-20, 2010-01-21, 2010-01-25]
* 分组结果为:
*
-
*
- [2010-01-15, 2010-01-16, 2010-01-17] *
- [2010-01-20, 2010-01-21] *
- [2010-01-25] *
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import net.yanhl.util.ReadProperties; import net.yanhl.util.StringUtil; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.lang.StringUtils; /** * Title: 日期工具类 * Description: * * @author Henry Yan * @since 1.0 * @version 1.0.0.20090605 */ public class DateUtil { public final static String FORMAT_DATE = "yyyy-MM-dd"; public final static String FORMAT_DATETIME = "yyyy-MM-dd HH:mm:ss"; public final static String FORMAT_DATE_ZH = "yyyy年MM月dd日"; public final static String FORMAT_DATETIME_ZH = "yyyy年MM月dd日 HH时mm分ss秒"; public final static String TYPE_DATE = "date"; public final static String TYPE_DATETIME = "datetime"; /** * 日期排序类型-升序 */ public final static int DATE_ORDER_ASC = 0; /** * 日期排序类型-降序 */ public final static int DATE_ORDER_DESC = 1; /** * 用字符串获得日期 * @throws ParseException * @dateValue 日期字符串 * @dateType 格式化的类型,date和datetime */ public static Date getDate(String dateValue, String dateType) throws ParseException { if (dateValue == null) return null; if (dateType.equals(TYPE_DATE)) { SimpleDateFormat sfdate = new SimpleDateFormat(FORMAT_DATE); return sfdate.parse(dateValue); } else if (dateType.equals(TYPE_DATETIME)) { SimpleDateFormat sftime = new SimpleDateFormat(FORMAT_DATETIME); return sftime.parse(dateValue); } return null; } /** * 用字符串获得java.sql.Date日期 * @throws ParseException * @dateValue 日期字符串 * @dateType 格式化的类型,date和datetime */ public static java.sql.Date getSqlDate(String dateValue, String dateType) throws ParseException { Date date = getDate(dateValue, dateType); if (date == null) { return null; } return new java.sql.Date(date.getTime()); } /** *将日期加上某些天或减去天数)返回字符串 * @param date 待处理日期 * @param to 加减的天数 * @return 日期 */ public static Date dateAdd(String date, int to) { java.util.Date d = null; try { d = java.sql.Date.valueOf(date); } catch (Exception e) { e.printStackTrace(); d = new java.util.Date(); } Calendar strDate = Calendar.getInstance(); strDate.setTime(d); strDate.add(Calendar.DATE, to); // 日期减 如果不够减会将月变动 return strDate.getTime(); } /** *将日期加上某些天或减去天数)返回字符串 * @param date 待处理日期 * @param to 加减的天数 * @return 日期 */ public static java.sql.Date dateAdd(java.sql.Date date, int to) { Calendar strDate = Calendar.getInstance(); strDate.setTime(date); strDate.add(Calendar.DATE, to); // 日期减 如果不够减会将月变动 return new java.sql.Date(strDate.getTime().getTime()); } /** * 格式化日期 * @param date 日期对象 * @param splitChar 分隔字符 * @return */ public static String formatDate(Date date, String splitChar) { java.text.SimpleDateFormat sfdate = new java.text.SimpleDateFormat("yyyy" + splitChar + "MM" + splitChar + "dd"); return sfdate.format(date); } /** * @dateValue 日期对象,可以是java.util.Date和java.sql.Date * @dateType 格式化的类型,date和datetime */ public static String format(Object dateValue, String dateType) { if (dateValue == null) return ""; if (dateValue instanceof java.sql.Date) { return dateValue.toString(); } else if (dateValue instanceof java.util.Date) { if (dateType.equals(TYPE_DATE)) { java.text.SimpleDateFormat sfdate = new java.text.SimpleDateFormat(FORMAT_DATE); return sfdate.format(dateValue); } else if (dateType.equals(TYPE_DATETIME)) { java.text.SimpleDateFormat sftime = new java.text.SimpleDateFormat(FORMAT_DATETIME); return sftime.format(dateValue); } else { return "非法日期格式[" + dateType + "]"; } } else { return "非日期类型"; } } /** * 转换日期对象为中文化日期 * @dateValue 日期对象,可以是java.util.Date和java.sql.Date * @dateType 格式化的类型,date和datetime */ public static String formatZh(Date dateValue, String dateType) { if (dateValue == null) return ""; if (dateValue instanceof java.sql.Date) { return dateValue.toString(); } else if (dateValue instanceof java.util.Date) { if (dateType.equals(TYPE_DATE)) { java.text.SimpleDateFormat sfdate = new java.text.SimpleDateFormat(FORMAT_DATE_ZH); return sfdate.format(dateValue); } else if (dateType.equals(TYPE_DATETIME)) { java.text.SimpleDateFormat sftime = new java.text.SimpleDateFormat(FORMAT_DATETIME_ZH); return sftime.format(dateValue); } else { return "非法日期格式[" + dateType + "]"; } } else { return "非日期类型"; } } /** * 转化成年月日期 * @param sDate 字符型日期:2009-02-02 * @param DelimeterChar 分割符号比如 / - * @return 年月日期 :2009年02月02日 */ public static String chDateChange(String sDate, String DelimeterChar) { String tmpArr[] = sDate.split(DelimeterChar); tmpArr[0] = tmpArr[0] + "年"; tmpArr[1] = tmpArr[1] + "月"; tmpArr[2] = tmpArr[2] + "日"; return tmpArr[0] + tmpArr[1] + tmpArr[2]; } /** * 得到系统日期 * @return YYYY-MM-DD */ public static String getSysdate() { java.sql.Timestamp timeNow = new java.sql.Timestamp(System.currentTimeMillis()); return timeNow.toString().substring(0, 10); } /** * 得到某天是周几 * @param strDay * @return 周几 */ public static int getWeekDay(String strDay) { Date day = DateUtil.dateAdd(strDay, -1); Calendar strDate = Calendar.getInstance(); strDate.setTime(day); int meStrDate = strDate.get(Calendar.DAY_OF_WEEK); return meStrDate; } /** * 得到某天是周几 * @param strDay * @return 周几 */ public static int getWeekDay(Date date) { Date day = DateUtil.dateAdd(format(date, "date"), -1); Calendar strDate = Calendar.getInstance(); strDate.setTime(day); int meStrDate = strDate.get(Calendar.DAY_OF_WEEK); return meStrDate; } /** * 取得两个日期段的日期间隔 * * @author color * @param t1 * 时间1 * @param t2 * 时间2 * @return t2 与t1的间隔天数 * @throws ParseException * 如果输入的日期格式不是0000-00-00 格式抛出异常 */ public static int getBetweenDays(String t1, String t2) throws ParseException { DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); int betweenDays = 0; Date d1 = format.parse(t1); Date d2 = format.parse(t2); betweenDays = getBetweenDays(d1, d2); return betweenDays; } /** * 取得两个日期段的日期间隔 * @param d1 日期1 * @param d2 日期2 * @return t2 与t1的间隔天数 */ private static int getBetweenDays(Date d1, Date d2) { if (d1 == null || d2 == null) { return -1; } int betweenDays; Calendar c1 = Calendar.getInstance(); Calendar c2 = Calendar.getInstance(); c1.setTime(d1); c2.setTime(d2); // 保证第二个时间一定大于第一个时间 if (c1.after(c2)) { c2.setTime(d1); c1.setTime(d2); } int betweenYears = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR); betweenDays = c2.get(Calendar.DAY_OF_YEAR) - c1.get(Calendar.DAY_OF_YEAR); for (int i = 0; i < betweenYears; i++) { c1.set(Calendar.YEAR, (c1.get(Calendar.YEAR) + 1)); betweenDays += c1.getMaximum(Calendar.DAY_OF_YEAR); } return betweenDays; } /** * 判断指定日期是否在一个日期范围内 * @param fromDate 范围开始日期 * @param toDate 范围结束日期 * @param testDate 测试日期 * @return 在范围内true,否则false */ public static boolean betweenDays(java.sql.Date fromDate, java.sql.Date toDate, java.sql.Date testDate) { if (fromDate == null || toDate == null || testDate == null) { return false; } //1、 交换开始和结束日期 if (fromDate.getTime() > toDate.getTime()) { java.sql.Date tempDate = fromDate; fromDate = toDate; toDate = tempDate; } //2、缩小范围 long testDateTime = testDate.getTime(); if ( (testDateTime > fromDate.getTime() && testDateTime > toDate.getTime()) || testDateTime < fromDate.getTime() && testDateTime < toDate.getTime()) { return false; } return true; } /** * 得到指定年、月的最后一天 * @param year 年 * @param month 月 * @return 本年月的最后一天,如果2009,10,返回结果:2009-10-31 */ public static String getLastDateDayOfMonth(int year, int month) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month); // 某年某月的最后一天 int lastDate = cal.getActualMaximum(Calendar.DATE); return year + "-" + (month + 1) + "-" + lastDate; } /** * 判断两个日期是否为同一天 * @param d1 日期一 * @param d2 日期二 * @return 同一天true,不是同一天false */ public static boolean isSameDate(Date d1, Date d2) { boolean result = false; Calendar c1 = Calendar.getInstance(); c1.setTime(d1); Calendar c2 = Calendar.getInstance(); c2.setTime(d2); if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) && c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH) && c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH)) { result = true; } return result; } /** * 是否为周末 * @param strDate * @return true|false */ public static boolean isWeekend(String strDate) { int weekDay = getWeekDay(strDate); if (weekDay == 6 || weekDay == 7) { return true; } else { return false; } } /** * 是否为周末 * @param strDate * @return true|false */ public static boolean isWeekend(Date date) { int weekDay = getWeekDay(format(date, "date")); if (weekDay == 6 || weekDay == 7) { return true; } else { return false; } } /** * 是否为法定节假日 * @param strDate * @return true|false */ public static boolean isHoliday(String strDate) { return false; } /** * 是否为法定节假日 * @param strDate * @return true|false * @throws ConfigurationException 读取系统配置文件时 */ public static boolean isHoliday(Date date) throws ConfigurationException { String specialDay = ReadProperties.getSystemValue("specialDay"); // 未设置法定节假日价格 if (!StringUtils.isEmpty(specialDay) && date != null) { String strDate = format(date, StringUtil.TYPE_DATE); String[] specialDays = specialDay.split(";"); if (StringUtil.hasInArray(specialDays, strDate)) { return true; } } return false; } /** * 日期排序 * @param dates 日期列表 * @param orderType 排序类型 * {@link net.yanhl.util.DateUtil.DATE_ORDER_ASC} * {@link net.yanhl.util.DateUtil.DATE_ORDER_DESC} * @return 排序结果 */ public static List orderDate(List dates, int orderType) { DateComparator comp = new DateComparator(orderType); Collections.sort(dates, comp); return dates; } /** * 日期分组 * 能够对指定日期列表按照连续性分组 * 例如:[2010-01-15, 2010-01-16, 2010-01-17, 2010-01-20, 2010-01-21, 2010-01-25] * 分组结果为: *
-
*
- [2010-01-15, 2010-01-16, 2010-01-17] *
- [2010-01-20, 2010-01-21] *
- [2010-01-25] *