java.util.Date日期时间工具类
import org.apache.commons.lang.StringUtils; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 日期工具类 */ public class DateUtil { private final SimpleDateFormat format; public DateUtil(SimpleDateFormat format) { this.format = format; } public SimpleDateFormat getFormat() { return format; } //紧凑型日期格式,也就是纯数字类型yyyyMMdd public static final DateUtil COMPAT = new DateUtil(new SimpleDateFormat("yyyyMMdd")); //常用日期格式,yyyy-MM-dd public static final DateUtil COMMON = new DateUtil(new SimpleDateFormat("yyyy-MM-dd")); public static final DateUtil COMMON_FULL = new DateUtil(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); //使用斜线分隔的,西方多采用,yyyy/MM/dd public static final DateUtil SLASH = new DateUtil(new SimpleDateFormat("yyyy/MM/dd")); //中文日期格式常用,yyyy年MM月dd日 public static final DateUtil CHINESE = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日")); public static final DateUtil CHINESE_FULL = new DateUtil(new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒")); private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy"); private final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd"); private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd"); private final static SimpleDateFormat sdfMonth = new SimpleDateFormat("yyyy-MM"); private final static SimpleDateFormat sdfTimes = new SimpleDateFormat("yyyyMMddHHmmss"); private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private final static SimpleDateFormat sdfTimeMillis = new SimpleDateFormat("yyyyMMddHHmmssSSS"); private final static SimpleDateFormat sdfTimeMilli = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); private static int getDateField(Date date, int field) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(field); } /** * 日期获取字符串 */ public String getDateText(Date date) { return getFormat().format(date); } /** * 字符串获取日期 * * @throws ParseException */ public Date getTextDate(String text) throws ParseException { return getFormat().parse(text); } /** * 日期获取字符串 */ public static String getDateText(Date date, String format) { return new SimpleDateFormat(format).format(date); } /** * 字符串获取日期 * * @throws ParseException */ public static Date getTextDate(String dateText, String format) throws ParseException { return new SimpleDateFormat(format).parse(dateText); } /** * 根据日期,返回其星期数,周一为1,周日为7 * * @param date * @return */ public static int getWeekDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int w = calendar.get(Calendar.DAY_OF_WEEK); int ret; if (w == Calendar.SUNDAY) ret = 7; else ret = w - 1; return ret; } /** * 获取yyyyMMMddHHmmssSSS格式 * * @return */ public static String getTimeMillis() { return sdfTimeMillis.format(new Date()); } /** * 获取yyyy-MMM-dd HH:mm:ss:SSS格式 * * @return */ public static String getTimeMilli() { return sdfTimeMilli.format(new Date()); } /** * 获取YYYY格式 * * @return */ public static String getSdfTimes() { return sdfTimes.format(new Date()); } /** * 获取YYYY格式 * * @return */ public static String getYear() { return sdfYear.format(new Date()); } /** * 获取YYYY-MM-DD格式 * * @return */ public static String getDay() { return sdfDay.format(new Date()); } /** * 获取YYYY-MM格式 * * @return */ public static String getMonth() { return sdfMonth.format(new Date()); } /** * 获取YYYYMMDD格式 * * @return */ public static String getDays() { return sdfDays.format(new Date()); } /** * 获取YYYY-MM-DD HH:mm:ss格式 * * @return */ public static String getTime() { return sdfTime.format(new Date()); } /** * 获取指定格式的当前日期 * * @return */ public static String getFormatTime(String format) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); return simpleDateFormat.format(new Date()); } /** * 将源日期转化为制定格式 * * @param sourceTime 源时间 * @param sourceFormat 源时间格式 * @param targetFormat 转化后的时间格式 * @return * @throws ParseException */ public static String getFormatTime(String sourceTime, String sourceFormat, String targetFormat) throws ParseException { SimpleDateFormat sourceDateFormat = new SimpleDateFormat(sourceFormat); SimpleDateFormat targetDateFormat = new SimpleDateFormat(targetFormat); Date date = sourceDateFormat.parse(sourceTime); return targetDateFormat.format(date); } /** * @param s * @param e * @return boolean * @throws * @Title: compareDate * @Description: TODO(日期比较 , 如果s > = e 返回true 否则返回false) * @author fh */ public static boolean compareDate(String s, String e) { if (fomatDate(s) == null || fomatDate(e) == null) { return false; } return fomatDate(s).getTime() >= fomatDate(e).getTime(); } /** * 格式化日期 * * @return */ public static Date fomatDate(String date) { DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); try { return fmt.parse(date); } catch (ParseException e) { // e.printStackTrace(); return null; } } /** * 校验日期是否合法 * * @return */ public static boolean isValidDate(String s) { DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); try { fmt.parse(s); return true; } catch (Exception e) { // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 return false; } } /** * @param startTime * @param endTime * @return */ public static int getDiffYear(String startTime, String endTime) { DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); try { //long aa=0; int years = (int) (((fmt.parse(endTime).getTime() - fmt.parse(startTime).getTime()) / (1000 * 60 * 60 * 24)) / 365); return years; } catch (Exception e) { // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 return 0; } } /** * <li>功能描述:时间相减得到天数 * * @param beginDateStr * @param endDateStr * @return long * @author Administrator */ public static long getDaySub(String beginDateStr, String endDateStr) { long day = 0; java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd"); java.util.Date beginDate = null; java.util.Date endDate = null; try { beginDate = format.parse(beginDateStr); endDate = format.parse(endDateStr); } catch (ParseException e) { // e.printStackTrace(); } day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000); //System.out.println("相隔的天数="+day); return day; } /** * 计算2个日期之间相差的 以年、月、日为单位,各自计算结果是多少 * 比如:2011-02-02 到 2017-03-02 * * @param beginDateStr * @param endDateStr * @return * @throws ParseException */ public static int getMonthDiffer(String beginDateStr, String endDateStr) throws ParseException { java.util.Date beginDate = null; java.util.Date endDate = null; java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM"); beginDate = format.parse(beginDateStr); endDate = format.parse(endDateStr); int from = getDateField(beginDate, Calendar.YEAR) * 12 - getDateField(beginDate, Calendar.MONTH); int to = getDateField(endDate, Calendar.YEAR) * 12 - getDateField(endDate, Calendar.MONTH); return to - from; } /** * 获取两个时间的 年份 或 月份 或 星期 或 天数 差值 * @param start 起始日期 * @param end 结束日期 * @param type 差值计算类型 Calendar.YEAR:年份 Calendar.MONTH:推算 Calendar.DATE:推算 * @return */ public static int getDifferBetweenDate(Date start, Date end, Integer type) { type = type == null ? Calendar.DATE : type; if (start.getTime() > end.getTime()) { Date temp = start; start = end; end = temp; } if (Calendar.DATE == type) return (int) ((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24)); else if (Calendar.MONTH == type) { int from = getDateField(start, Calendar.YEAR) * 12 - getDateField(start, Calendar.MONTH); int to = getDateField(end, Calendar.YEAR) * 12 - getDateField(end, Calendar.MONTH); return to - from; } return getDateField(end, type) - getDateField(start, type); } /** * 获取两个时间的 年份 或 月份 或 星期 或 天数 差值 * @param startStr 起始日期字符串(yyyy-MM-dd)格式 * @param endStr 结束日期字符串(yyyy-MM-dd)格式 * @param type 差值计算类型 Calendar.YEAR:年份 Calendar.MONTH:推算 Calendar.WEEK_OF_YEAR:星期 Calendar.DATE:推算 * @return */ public static int getDifferBetweenDate(String startStr, String endStr, Integer type) throws Exception { java.util.Date end = new Date(); java.util.Date start = new Date(); java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd"); if (StringUtils.isNotBlank(startStr)) start = format.parse(startStr); if (StringUtils.isNotBlank(endStr)) end = format.parse(endStr); return getDifferBetweenDate(start, end, type); } /** * 根据指定开始年月,获取指定日期 formatStr(自定义) 字符串 * * @param startStr 计算开始日期时间字符串(yyyy-MM-dd)格式,该字段为空时则以当前时间开始计算 * @param type 计算类型 Calendar.YEAR:年份推算 Calendar.MONTH:推算月份 Calendar.DATE:推算日期 * @param nums 推算长度 大于0:往后推算 小于0:往前推算 * @param formatStr 需要得到的结果字符串日期时间格式,该字段为空时返回yyyy-MM-dd格式字符串 * @return 获取startStr开始nums长度后的formatStr格式的日期时间字符串,monthStr、formatStr为空时以当前时间开始返回yyyy-MM-dd格式的年月字符串 * @throws Exception */ public static String getAssignDate(String startStr, Integer type, Integer nums, String formatStr) throws Exception { Calendar rightNow = Calendar.getInstance(); if (StringUtils.isNotBlank(startStr)) { java.text.SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd"); java.util.Date beginDate = format.parse(startStr); rightNow.setTime(beginDate); } rightNow.add(type == null ? Calendar.MONTH : type, nums == null ? 0 : nums); // rightNow.add(Calendar.YEAR,-1);//日期减1年 // rightNow.add(Calendar.MONTH, nums);//日期加3个月 // rightNow.add(Calendar.DAY_OF_YEAR,5);//日期加5天 return getDateFormatStr(StringUtils.isBlank(formatStr) ? "yyyy-MM-dd" : formatStr, rightNow.getTime()); } /** * 得到n天之后的日期 formatStr(自定义) 格式,默认(format为空)返回(yyyy-MM-dd)格式 * * @param days 推算天数 大于0:往后推算 小于0:往前推算 * @return formatStr格式的日期时间字符串,formatStr为空时返回yyyy-MM-dd格式 */ public static String getAfterDayDate(String days, String formatStr) { int daysInt = Integer.parseInt(days); Calendar canlendar = Calendar.getInstance(); // java.util包 canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动 return getDateFormatStr(StringUtils.isBlank(formatStr) ? "yyyy-MM-dd" : formatStr, canlendar.getTime()); } /** * 得到n个月之后的日期 formatStr(自定义) 格式,默认(formatStr为空)返回(yyyy-MM)格式 * * @param months 推算月份 大于0:往后推算 小于0:往前推算 * @return formatStr格式的日期时间字符串,formatStr为空时返回yyyy-MM格式 */ public static String getAfterMonthDate(String months, String formatStr) { int monthsInt = Integer.parseInt(months); Calendar canlendar = Calendar.getInstance(); // java.util包 canlendar.add(Calendar.MONTH, monthsInt); // 日期减 如果不够减会将月变动 return getDateFormatStr(StringUtils.isBlank(formatStr) ? "yyyy-MM" : formatStr, canlendar.getTime()); } /** * 得到n天之后是周几 * * @param days * @return */ public static String getAfterDayWeek(String days) { int daysInt = Integer.parseInt(days); Calendar canlendar = Calendar.getInstance(); // java.util包 canlendar.add(Calendar.DATE, daysInt); // 日期减 如果不够减会将月变动 return getDateFormatStr("E", canlendar.getTime()); } private static String getDateFormatStr(String formatStr, Date date) { SimpleDateFormat sdfd = new SimpleDateFormat(formatStr); return sdfd.format(date); } public static void main(String[] args) throws Exception { System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2018-05-03", Calendar.YEAR)); System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2012-05-03", Calendar.MONTH)); System.out.println(DateUtil.getMonthDiffer("2016-05-01", "2012-05-03")); System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2018-05-03", Calendar.WEEK_OF_YEAR)); System.out.println(DateUtil.getDifferBetweenDate("2016-05-01", "2018-05-03", Calendar.DATE)); } }