借鉴网上资源与工作中经验整理的时间工具类(主要针对java.util.Date的使用,java8后的时间工具下期整理),欢迎大家一起完善补充。@Slf4j public class DateUtils {/*** 定时器时间*/public static final String FORMAT_CRON = "ss mm HH dd MM ?";/*** 日期格式*/public static final String FORMAT_DATE = "yyyyMMdd";/*** 日期格式 -*/public static final String FORMAT_DATE_HORIZONTAL = "yyyy-MM-dd";/*** 日期格式 /*/public static final String FORMAT_DATE_BIAS = "yyyy/MM/dd";/*** 时间格式*/public static final String FORMAT_TIME = "HHmmss";/*** 时间格式 :*/public static final String FORMAT_TIME_COLON = "HH:mm:ss";/*** 完整日期*/public static final String FORMAT_DATETIME = "yyyyMMddhhmmss";/*** 完整日期 -*/public static final String FORMAT_DATETIME_HORIZONTAL = "yyyy-MM-dd HH:mm:ss";/*** 完整日期 /*/public static final String FORMAT_DATETIME_BIAS = "yyyy/MM/dd HH:mm:ss";private DateUtils() {}/**================================= 今天、昨天、本周、上周、本年及特定时间的开始时间和结束时间 ================================**//*** 获取当天开始时间** @return java.util.Date*/public static Date getDayBegin() {Calendar cal = Calendar.getInstance();cal.set(Calendar.HOUR_OF_DAY, 0); //0点cal.set(Calendar.MINUTE, 0); //0分cal.set(Calendar.SECOND, 0); //0秒cal.set(Calendar.MILLISECOND, 0); //0毫秒return cal.getTime();}/*** 获取当天结束时间** @return java.util.Date*/public static Date getDayEnd() {Calendar cal = Calendar.getInstance();cal.set(Calendar.HOUR_OF_DAY, 23); //23点cal.set(Calendar.MINUTE, 59); //59分cal.set(Calendar.SECOND, 59); //59秒return cal.getTime();}/*** 获取昨天开始时间** @return java.util.Date*/public static Date getBeginDayOfYesterday() {Calendar cal = Calendar.getInstance();cal.setTime(getDayBegin()); //当天开始时间cal.add(Calendar.DAY_OF_MONTH, -1); //当天月份天数减1return cal.getTime();}/*** 获取昨天结束时间** @return java.util.Date*/public static Date getEndDayOfYesterday() {Calendar cal = Calendar.getInstance();cal.setTime(getDayEnd()); //当天结束时间cal.add(Calendar.DAY_OF_MONTH, -1); //当天月份天数减1return cal.getTime();}/*** 获取明天开始时间** @return java.util.Date*/public static Date getBeginDayOfTomorrow() {Calendar cal = Calendar.getInstance();cal.setTime(getDayBegin()); //当天开始时间cal.add(Calendar.DAY_OF_MONTH, 1); //当天月份天数加1return cal.getTime();}/*** 获取明天结束时间** @return java.util.Date*/public static Date getEndDayOfTomorrow() {Calendar cal = Calendar.getInstance();cal.setTime(getDayEnd()); //当天结束时间cal.add(Calendar.DAY_OF_MONTH, 1); //当天月份天数加1return cal.getTime();}/*** 获取某个日期的开始时间** @param d 指点日期* @return Timestamp*/public static Timestamp getDayStartTime(Date d) {Calendar calendar = Calendar.getInstance();if (null != d) {calendar.setTime(d);}calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);calendar.set(Calendar.MILLISECOND, 0);return new Timestamp(calendar.getTimeInMillis());}/*** 获取某个日期的结束时间** @param d 指定日期* @return Timestamp*/public static Timestamp getDayEndTime(Date d) {Calendar calendar = Calendar.getInstance();if (null != d) {calendar.setTime(d);}calendar.set(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);calendar.set(Calendar.MILLISECOND, 999);return new Timestamp(calendar.getTimeInMillis());}/*** 获取本周的开始时间** @return java.util.Date*/@SuppressWarnings("unused")public static Date getBeginDayOfWeek() {Date date = new Date();Calendar cal = Calendar.getInstance();cal.setTime(date);int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);if (dayOfWeek == 1) {dayOfWeek += 7;}cal.add(Calendar.DATE, 2 - dayOfWeek);return getDayStartTime(cal.getTime());}/*** 获取本周的结束时间** @return java.util.Date*/public static Date getEndDayOfWeek() {Calendar cal = Calendar.getInstance();cal.setTime(getBeginDayOfWeek());cal.add(Calendar.DAY_OF_WEEK, 6);Date weekEndSta = cal.getTime();return getDayEndTime(weekEndSta);}/*** 获取上周开始时间*/@SuppressWarnings("unused")public static Date getBeginDayOfLastWeek() {Date date = new Date();Calendar cal = Calendar.getInstance();cal.setTime(date);int dayofweek = cal.get(Calendar.DAY_OF_WEEK);if (dayofweek == 1) {dayofweek += 7;}cal.add(Calendar.DATE, 2 - dayofweek - 7);return getDayStartTime(cal.getTime());}/*** 获取上周的结束时间** @return java.util.Date*/public static Date getEndDayOfLastWeek() {Calendar cal = Calendar.getInstance();cal.setTime(getBeginDayOfLastWeek());cal.add(Calendar.DAY_OF_WEEK, 6);Date weekEndSta = cal.getTime();return getDayEndTime(weekEndSta);}/*** 获取今年是哪一年** @return Integer*/public static Integer getNowYear() {Date date = new Date();GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();gc.setTime(date);return gc.get(Calendar.YEAR);}/*** 获取本月是哪一月** @return Integer*/public static Integer getNowMonth() {Date date = new Date();GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();gc.setTime(date);return gc.get(Calendar.MONTH) + 1;}/*** 获取本月的开始时间** @return java.util.Date*/public static Date getBeginDayOfMonth() {Calendar calendar = Calendar.getInstance();calendar.set(getNowYear(), getNowMonth() - 1, 1);return getDayStartTime(calendar.getTime());}/*** 获取本月的结束时间** @return java.util.Date*/public static Date getEndDayOfMonth() {Calendar calendar = Calendar.getInstance();calendar.set(getNowYear(), getNowMonth() - 1, 1);int day = calendar.getActualMaximum(5);calendar.set(getNowYear(), getNowMonth() - 1, day);return getDayEndTime(calendar.getTime());}/*** 获取上月的开始时间** @return java.util.Date*/public static Date getBeginDayOfLastMonth() {Calendar calendar = Calendar.getInstance();calendar.set(getNowYear(), getNowMonth() - 2, 1);return getDayStartTime(calendar.getTime());}/*** 获取上月的结束时间** @return java.util.Date*/public static Date getEndDayOfLastMonth() {Calendar calendar = Calendar.getInstance();calendar.set(getNowYear(), getNowMonth() - 2, 1);int day = calendar.getActualMaximum(5);calendar.set(getNowYear(), getNowMonth() - 2, day);return getDayEndTime(calendar.getTime());}/*** 获取本年的开始时间** @return java.util.Date*/public static Date getBeginDayOfYear() {Calendar cal = Calendar.getInstance();cal.set(Calendar.YEAR, getNowYear());cal.set(Calendar.MONTH, Calendar.JANUARY);cal.set(Calendar.DATE, 1);return getDayStartTime(cal.getTime());}/*** 获取本年的结束时间** @return java.util.Date*/public static Date getEndDayOfYear() {Calendar cal = Calendar.getInstance();cal.set(Calendar.YEAR, getNowYear());cal.set(Calendar.MONTH, Calendar.DECEMBER);cal.set(Calendar.DATE, 31);return getDayEndTime(cal.getTime());}/*** 两个日期相减得到的天数** @param beginDate 开始时间* @param endDate 结束时间* @return Long*/public static Long getDiffDays(Date beginDate, Date endDate) {if (beginDate == null || endDate == null) {throw new IllegalArgumentException("getDiffDays param is null!");}return (endDate.getTime() - beginDate.getTime()) / (1000 * 60 * 60 * 24);}/*** 两个日期相减得到的毫秒数** @param beginDate 开始时间* @param endDate 结束时间* @return Long*/public static Long dateDiff(Date beginDate, Date endDate) {long date1ms = beginDate.getTime();long date2ms = endDate.getTime();return date2ms - date1ms;}/*** 获取两个日期中的最大日起** @param beginDate 开始时间* @param endDate 结束时间* @return java.util.Date*/public static Date max(Date beginDate, Date endDate) {if (beginDate == null) {return endDate;}if (endDate == null) {return beginDate;}//beginDate日期大于endDateif (beginDate.after(endDate)) {return beginDate;}return endDate;}/*** 获取两个日期中的最小日期** @param beginDate 开始时间* @param endDate 结束时间* @return java.util.Date*/public static Date min(Date beginDate, Date endDate) {if (beginDate == null) {return endDate;}if (endDate == null) {return beginDate;}if (beginDate.after(endDate)) {return endDate;}return beginDate;}/*** 获取某月该季度的第一个月** @param date 指定时间* @return java.util.Date*/public static Date getFirstSeasonDate(Date date) {final int[] quarters = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};Calendar cal = Calendar.getInstance();cal.setTime(date);int sean = quarters[cal.get(Calendar.MONTH)];cal.set(Calendar.MONTH, sean * 3 - 3);return cal.getTime();}/*** 返回某个日期下几天的日期** @param date* @param i* @return*/public static Date getNextDay(Date date, int i) {Calendar cal = new GregorianCalendar();cal.setTime(date);cal.set(Calendar.DATE, cal.get(Calendar.DATE) + i);return cal.getTime();}/*** 返回某个日期前几天的日期** @param date* @param i* @return*/public static Date getFrontDay(Date date, int i) {Calendar cal = new GregorianCalendar();cal.setTime(date);cal.set(Calendar.DATE, cal.get(Calendar.DATE) - i);return cal.getTime();}/*** 获取某年某月按天切片日期集合(某个月间隔多少天的日期集合)** @param beginYear* @param beginMonth* @param k* @return*/@SuppressWarnings({"unchecked", "rawtypes"})public static List getTimeList(int beginYear, int beginMonth, int k) {List list = new ArrayList();Calendar begincal = new GregorianCalendar(beginYear, beginMonth, 1);int max = begincal.getActualMaximum(Calendar.DATE);for (int i = 1; i < max; i = i + k) {list.add(begincal.getTime());begincal.add(Calendar.DATE, k);}begincal = new GregorianCalendar(beginYear, beginMonth, max);list.add(begincal.getTime());return list;}/*** 获取某年某月到某年某月按天的切片日期集合(间隔天数的集合)** @param beginYear* @param beginMonth* @param endYear* @param endMonth* @param k* @return*/@SuppressWarnings({"rawtypes", "unchecked"})public static List getTimeList(int beginYear, int beginMonth, int endYear, int endMonth, int k) {List list = new ArrayList();if (beginYear == endYear) {for (int j = beginMonth; j <= endMonth; j++) {list.add(getTimeList(beginYear, j, k));}} else {for (int j = beginMonth; j < 12; j++) {list.add(getTimeList(beginYear, j, k));}for (int i = beginYear + 1; i < endYear; i++) {for (int j = 0; j < 12; j++) {list.add(getTimeList(i, j, k));}}for (int j = 0; j <= endMonth; j++) {list.add(getTimeList(endYear, j, k));}}return list;}/**================================= 时间格式转换 ================================**//*** date类型进行格式化输出(返回类型:String)** @param date* @return*/public static String dateFormat(Date date) {return new SimpleDateFormat(FORMAT_DATETIME_HORIZONTAL).format(date);}public static String dateFormat(Date date, String pattern) {return new SimpleDateFormat(pattern).format(date);}/*** 将"2015-08-31 21:08:06"型字符串转化为Date** @param str* @return* @throws ParseException*/public static Date stringToDate(String str) throws ParseException {return new SimpleDateFormat(FORMAT_DATETIME_HORIZONTAL).parse(str);}public static Date stringToDate(String str, String pattern) throws ParseException {return new SimpleDateFormat(pattern).parse(str);}/*** 将long类型转化为Date** @param date* @return* @throws ParseException*/public static Date longToDate(Long date) {return new Date(date * 1000);}/*** 将Date类型转化为long** @param date* @return* @throws ParseException*/public static Long dateToLong(Date date) {return date.getTime();}/**================================= 其他常见日期操作方法 ================================**//*** 判断当前日期是否在[startDate, endDate]区间** @param startDate 开始日期* @param endDate 结束日期* @return* @author jqlin*/public static boolean isEffectiveDate(Date startDate, Date endDate) {if (startDate == null || endDate == null) {return false;}long currentTime = new Date().getTime();if (currentTime >= startDate.getTime() && currentTime <= endDate.getTime()) {return true;}return false;}/*** 得到二个日期间的间隔天数** @param secondString:后一个日期* @param firstString:前一个日期* @return*/public static String getTwoDay(String secondString, String firstString) {SimpleDateFormat myFormatter = new SimpleDateFormat(FORMAT_DATE_HORIZONTAL);long day;try {java.util.Date secondTime = myFormatter.parse(secondString);java.util.Date firstTime = myFormatter.parse(firstString);day = (secondTime.getTime() - firstTime.getTime()) / (24 * 60 * 60 * 1000);} catch (Exception e) {return "";}return day + "";}/*** 时间前推或后推分钟,其中JJ表示分钟.** @param StringTime:时间* @param minute:分钟(有正负之分)* @return*/public static String getPreTime(String stringTime, String minute) {SimpleDateFormat format = new SimpleDateFormat(FORMAT_DATETIME_HORIZONTAL);String mydate1;try {Date date1 = format.parse(stringTime);long time = (date1.getTime() / 1000) + Integer.parseInt(minute) * 60;date1.setTime(time * 1000);mydate1 = format.format(date1);} catch (Exception e) {return "";}return mydate1;}/*** 将短时间格式字符串转换为时间 yyyy-MM-dd** @param strDate* @return*/public static Date strToDate(String strDate) {return new SimpleDateFormat(FORMAT_DATE_HORIZONTAL).parse(strDate, new ParsePosition(0));}/*** 得到一个时间延后或前移几天的时间** @param nowdate:时间* @param delay:前移或后延的天数* @return*/public static String getNextDay(String nowdate, String delay) {try {SimpleDateFormat format = new SimpleDateFormat(FORMAT_DATETIME_HORIZONTAL);String mdate = "";Date d = strToDate(nowdate);long myTime = (d.getTime() / 1000) + Integer.parseInt(delay) * 24 * 60 * 60;d.setTime(myTime * 1000);mdate = format.format(d);return mdate;} catch (Exception e) {return "";}}/*** 判断是否闰年** @param ddate* @return*/public static boolean isLeapYear(String ddate) {/*** 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年* 3.能被4整除同时能被100整除则不是闰年*/Date d = strToDate(ddate);GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();gc.setTime(d);int year = gc.get(Calendar.YEAR);if ((year % 400) == 0 || ((year % 4) == 0 && (year % 100) != 0)) {return true;}return false;}/*** 判断二个时间是否在同一个周** @param date1* @param date2* @return*/public static boolean isSameWeekDates(Date date1, Date date2) {Calendar cal1 = Calendar.getInstance();Calendar cal2 = Calendar.getInstance();cal1.setTime(date1);cal2.setTime(date2);int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)&&(0 == subYear || (1 == subYear && 11 == cal2.get(Calendar.MONTH)) || (-1 == subYear && 11 == cal1.get(Calendar.MONTH)))) {return true;}return false;}/*** 产生周序列,即得到当前时间所在的年度是第几周** @return*/public static String getSeqWeek() {Calendar c = Calendar.getInstance(Locale.CHINA);String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));if (week.length() == 1)week = "0" + week;String year = Integer.toString(c.get(Calendar.YEAR));return year + "年第" + week + "周";}/*** 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号** @param sdate:日期* @param num:星期几(星期天是一周的第一天)* @return*/public static String getWeek(String sdate, String num) {// 再转换为时间Date dd = strToDate(sdate);Calendar c = Calendar.getInstance();c.setTime(dd);if (num.equals("1")) // 返回星期一所在的日期c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);else if (num.equals("2")) // 返回星期二所在的日期c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);else if (num.equals("3")) // 返回星期三所在的日期c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);else if (num.equals("4")) // 返回星期四所在的日期c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);else if (num.equals("5")) // 返回星期五所在的日期c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);else if (num.equals("6")) // 返回星期六所在的日期c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);else if (num.equals("0")) // 返回星期日所在的日期c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);return new SimpleDateFormat(FORMAT_DATE_HORIZONTAL).format(c.getTime());}/*** 根据一个日期,返回是星期几的字符串** @param sdate* @return*/public static String getWeek(String sdate) {// 再转换为时间Date date = strToDate(sdate);Calendar c = Calendar.getInstance();c.setTime(date);return new SimpleDateFormat("EEEE").format(c.getTime());}/*** 根据一个日期,返回是星期几的字符串** @param sdate* @return*/public static String getWeekStr(String sdate) {String str = "";str = getWeek(sdate);if ("1".equals(str)) {str = "星期日";} else if ("2".equals(str)) {str = "星期一";} else if ("3".equals(str)) {str = "星期二";} else if ("4".equals(str)) {str = "星期三";} else if ("5".equals(str)) {str = "星期四";} else if ("6".equals(str)) {str = "星期五";} else if ("7".equals(str)) {str = "星期六";}return str;}/*** 两个时间之间的天数** @param date1* @param date2* @return*/public static long getDays(String date1, String date2) throws ParseException {if (date1 == null || date1.equals(""))return 0;if (date2 == null || date2.equals(""))return 0;// 转换为标准时间SimpleDateFormat myFormatter = new SimpleDateFormat(FORMAT_DATE_HORIZONTAL);Date date = myFormatter.parse(date1);Date mydate = myFormatter.parse(date2);return (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);}/*** 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写** @param format* @return*/public static String getCurrentFormatDate(String format) {return new SimpleDateFormat(format).format(new Date());}/*** N天后** @param current* @param days* @return java.util.date*/public static Date plusDate(Date current, int days) {Calendar calendar = new GregorianCalendar();calendar.setTime(current);calendar.add(Calendar.DATE, days);return calendar.getTime();}}