package com.matrix.core.tools; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * 日期格式化,转换工具类 * * @author Ron * @createTime 2014.08.30 */ public class DateUtil { private final static int[] dayArr = new int[] { 20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22 }; private final static String[] constellationArr = new String[] { "摩羯座", "水瓶座", "双鱼座", "白羊座", "金牛座", "双子座", "巨蟹座", "狮子座", "处女座", "天秤座", "天蝎座", "射手座", "摩羯座" }; public static final String DATE_FORMAT_STS = "yyyy-MM-dd'T'HH:mm:ss"; public static final String DATE_FORMAT_ST = "yyyy-MM-dd'T'HH:mm"; public static final String HH_mm = "HH:mm"; public static final String HHmm = "HHmm"; public static final String MONTH = "yyyy-MM"; public static final String DATE_FORMAT_SS = "yyyy-MM-dd HH:mm:ss"; public static final String DATE_FORMAT_MONGO = "yyyy-MM-dd'T'HH:mm:ss.SSS"; public static final String DATE_FORMAT_MM = "yyyy-MM-dd HH:mm"; public static final String DATE_FORMAT_HH = "yyyy-MM-dd HH"; public static final String DATE_FORMAT_DD = "yyyy-MM-dd"; public static final String DATE_FORMAT_SPLITE_DD = "yyyy.MM.dd"; public static final String DATE_FORMAT_NO_SPLITE_DD = "yyyyMMdd"; public static final String DATE_FORMAT_MM_NO_DD = "yyyyMM"; public static final String DATE_FORMAT_NO_SPLITE_MM = "yyyyMMddHHmm"; public static final String DATE_FORMAT_NO_SPLITE_MM_HH = "yyyyMMddHH"; public static final String YEAR = "yyyy"; public static final String DATE_FORMAT_MMDD = "M月d日"; public static final String DATE_FORMAT_WEEK = "周"; public static final String DATE_TIME_MORNING = "早上"; public static final String DATE_TIME_AFTERNOON = "下午"; public static final String DATE_TIME_NIGHT = "晚上"; public static final String CENTRE_SCRIBING = "-"; public static final String MINUTE = "MINUTE"; protected static final String EMPTY = ""; protected static final String ZERO = "0"; protected static final String SPLITE_CHAR = ":"; // 空格不能删除 protected static final String START_TIME = " 00:00:00"; // 空格不能删除 protected static final String END_TIME = " 23:59:59"; protected static final int WEEK_DAYS = 7; public static String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss"; protected static final String[] WEEKS = { "一", "二", "三", "四", "五", "六", "日" }; /** * 返回年份 * * @param date * 日期 * @return 返回年份 */ public static int getYear(Date date) { try { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.YEAR); } catch (Exception e) { } return 0; } /** * Java通过生日计算星座 * * @param month * @param day * @return */ public static String getConstellation(int month, int day) { return day < dayArr[month - 1] ? constellationArr[month - 1] : constellationArr[month]; } /** * * @Title: getNextNMinute 获取date之后N分钟的时间 * @Description: TODO * @author:罗凯 * @param date * @return * Date 返回类型 * @date 2016年8月3日 下午2:48:51 * @throws */ public static Date getNextNMinute(Date date,int n){ return new Date(date.getTime()+(n*60*1000)); } /** * 返回月份 * * @param date * 日期 * @return 返回月份 */ public static int getMonth(Date date) { try { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.MONTH) + 1; } catch (Exception e) { } return 0; } /** * 日期转字符串 * * @param date * @param format * @return */ public static String dateToString(Date date, String format) { if (date == null) { return EMPTY; } DateFormat fmt = new SimpleDateFormat(format); return fmt.format(date); } /** * 字符串转日期 * * @param dateStr * @param format * @return */ public static Date stringToDate(String dateStr, String format) { DateFormat fmt = new SimpleDateFormat(format); try { return fmt.parse(dateStr); } catch (ParseException e) { } return null; } /** * 获取一个编码 * 获取一个当前时间并且加入了四位的随机字母 * @return */ public static String getTimeCode() { return dateToString(new Date(), "yyyyMMddssSSS")+StringUtils.getRandomString(4); } /** * 判断给定的日期是一周中的第几天,注意:按照中国的习惯,周日是第七天 * * @param date * @return */ public static int dateToWeek(Date date) { if (date == null) { return 0; } Calendar cal = Calendar.getInstance(); cal.setTime(date); if (cal.get(Calendar.DAY_OF_WEEK) == 1) { return 7; } else { return cal.get(Calendar.DAY_OF_WEEK) - 1; } } public static String dateOfWeek(Date date) { return DATE_FORMAT_WEEK + WEEKS[dateToWeek(date) - 1]; } /** * 指定时间的下一天 * * @param date * @return */ public static Date nextDate(Date date) { if (date == null) { return date; } Calendar cal = Calendar.getInstance(); try { cal.setTime(date); cal.add(Calendar.DATE, 1); return cal.getTime(); } catch (Exception e) { } return null; } /** * 指定时间的前一天 * * @param date * @return */ public static Date previousDate(Date date) { if (date == null) { return date; } Calendar cal = Calendar.getInstance(); try { cal.setTime(date); cal.add(Calendar.DATE, -1); return cal.getTime(); } catch (Exception e) { } return null; } /** * 指定时间的下N天 * * @param date * @return */ public static Date nextNDate(Date date, int nDay) { if (date == null) { return date; } Calendar cal = Calendar.getInstance(); try { cal.setTime(date); cal.add(Calendar.DATE, nDay); return cal.getTime(); } catch (Exception e) { } return null; } /** * 指定时间的前N天 * * @param date * @return */ public static Date previousNDate(Date date, int nDay) { if (date == null) { return date; } Calendar cal = Calendar.getInstance(); try { cal.setTime(date); cal.add(Calendar.DATE, -nDay); return cal.getTime(); } catch (Exception e) { } return null; } /** * 获取一天的起始时间 * * @param date * @return */ public static Date getStartDate(Date date) { if (date == null) { return date; } DateFormat fmt = new SimpleDateFormat(DATE_FORMAT_DD); String dateStr = fmt.format(date); dateStr = dateStr + START_TIME; fmt = new SimpleDateFormat(DATE_FORMAT_SS); try { return fmt.parse(dateStr); } catch (ParseException e) { } return date; } /** * 获取一天的结束时间 * * @param date * @return */ public static Date getEndDate(Date date) { if (date == null) { return date; } DateFormat fmt = new SimpleDateFormat(DATE_FORMAT_DD); String dateStr = fmt.format(date); dateStr = dateStr + END_TIME; fmt = new SimpleDateFormat(DATE_FORMAT_SS); try { return fmt.parse(dateStr); } catch (ParseException e) { } return date; } /** * currentDat是否在referenceDate日期之前 * * @param referenceDate * @param currentDat * @return */ public static boolean isBeforeDate(Date referenceDate, Date currentDate) { if (currentDate == null) { return false; } if (referenceDate == null) { return true; } return currentDate.before(referenceDate); } /** * currentDat是否在referenceDate日期之后 * * @param referenceDate * @param currentDat * @return */ public static boolean isAffterDate(Date referenceDate, Date currentDate) { if (currentDate == null) { return false; } if (referenceDate == null) { return true; } return currentDate.after(referenceDate); } public static long getDifTimeMin(Date beginTime,Date endTime){ return (endTime.getTime()-beginTime.getTime())/1000/ 60; } public static List getFutureDay(Date date, int start,int end){ List dates=new ArrayList(); for (int i = 0; i < end-start; i++) { dates.add(DateUtil.nextNDate(date,i)); } return dates; } /** * 字符串转日期 如果转换失败就返回一个当前时间date * * @param dateStr * @param format * @return */ public static Date stringToDateNew(String dateStr, String format) { if (StringUtils.isBlank(dateStr) || StringUtils.isBlank(format)) { return new Date(); } DateFormat fmt = new SimpleDateFormat(format); try { return fmt.parse(dateStr); } catch (ParseException e) { } return new Date(); } /** * 判断currentDate是否在startDate和endDate之间,不包括startDate和endDate * * @param startDate * @param endDate * @param currentDate * @return */ public static boolean isDuringDate(Date startDate, Date endDate, Date currentDate) { if (currentDate == null) { return false; } if (isAffterDate(startDate, currentDate) && isBeforeDate(endDate, currentDate)) { return true; } return false; } /** * 获取startDate到endDate之间的星期day(中文星期)不包括startDate和endDate * * @param startDate * @param endDate * @param day * @return */ public static List findDayDuringDate(Date startDate, Date endDate, int day) { List listDate = new ArrayList(); int startDay = dateToWeek(startDate); Date date = null; if (startDay == day) { date = nextNDate(startDate, WEEK_DAYS); } else { date = nextNDate(startDate, day - startDay); } while (isDuringDate(startDate, endDate, date)) { listDate.add(date); date = nextNDate(date, WEEK_DAYS); } return listDate; } /** * date转换成Timestamp * * @param date * @param format * @return */ public static Timestamp dateToTimestamp(Date date, String format) { if (date == null) { return null; } format = DATE_FORMAT_SS; DateFormat fmt = new SimpleDateFormat(format); return Timestamp.valueOf(fmt.format(date)); } /** * 获取早中晚 * * @param time * @return */ public static String getDateTime(int time) { // 早上 if (time == 1) { return DateUtil.DATE_TIME_MORNING; } // 下午 else if (time == 2) { return DateUtil.DATE_TIME_AFTERNOON; } // 晚上 else if (time == 3) { return DateUtil.DATE_TIME_NIGHT; } return null; } /** * 获取早中晚的开始时间 * * @param date * @param time * @return */ public static Date getMeetTimeStart(String date, int time) { // 早上 if (time == 1) { return DateUtil.stringToDate(date + " 06:00", DateUtil.DATE_FORMAT_MM); } // 下午 else if (time == 2) { return DateUtil.stringToDate(date + " 13:00", DateUtil.DATE_FORMAT_MM); } // 晚上 else if (time == 3) { return DateUtil.stringToDate(date + " 19:00", DateUtil.DATE_FORMAT_MM); } return null; } /** * 获取早中晚的结束时间 * * @param date * @param time * @return */ public static Date getMeetTimeEnd(String date, int time) { // 早上 if (time == 1) { return DateUtil.stringToDate(date + " 13:00", DateUtil.DATE_FORMAT_MM); } // 下午 else if (time == 2) { return DateUtil.stringToDate(date + " 19:00", DateUtil.DATE_FORMAT_MM); } // 晚上 else if (time == 3) { return DateUtil.stringToDate(date + " 23:00", DateUtil.DATE_FORMAT_MM); } return null; } /** * 得到几天前的时间 * * @param d * @param day * @return */ public static Timestamp getDateBefore(Date d, int day) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.DATE, now.get(Calendar.DATE) - day); return new Timestamp(now.getTime().getTime()); } /** * 得到几天后的时间 * * @param d * @param day * @return */ public static Timestamp getDateAfter(Date d, int day) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.DATE, now.get(Calendar.DATE) + day); return new Timestamp(now.getTime().getTime()); } /** * 将日期类型格式化成字符串 * * @param date * @return 格式化后日期字符串 * @throws ParseException */ public static String dateFormatStr(Date date, String dateStyle) { String dateStr = null; if (date != null) { SimpleDateFormat sdf = new SimpleDateFormat(dateStyle); dateStr = sdf.format(date); } return dateStr; } /** * 获取时间戳 * * @return */ public static String getTimeMark() { Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int mouth = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); int second = c.get(Calendar.SECOND); int haomiao = c.get(Calendar.MILLISECOND); return "" + year + mouth + day + hour + minute + second + haomiao; } /** * 获取当前时间后的几年 * @param d * @param year * @return */ public static Timestamp getDateAfterYear(Date d, int year) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.YEAR, now.get(Calendar.YEAR) + year); return new Timestamp(now.getTime().getTime()); } /** * 获取当前时间后的几个月 * @param d * @param month * @return */ public static Timestamp getDateAfterMonth(Date d, int month) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.MONTH, now.get(Calendar.MONTH) + month); return new Timestamp(now.getTime().getTime()); } /** * 获取当前时间后的几个小时 * @param d * @param hours * @return */ public static Timestamp getDateAfterHours(Date d, int hours) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.HOUR_OF_DAY, now.get(Calendar.HOUR_OF_DAY) + hours); return new Timestamp(now.getTime().getTime()); } public static Timestamp getDateAfterMinute(Date d, int minute) { Calendar now = Calendar.getInstance(); now.setTime(d); now.set(Calendar.MINUTE, now.get(Calendar.MINUTE) + minute); return new Timestamp(now.getTime().getTime()); } /** * 计算2个时间直接的时间差 */ public static long getTimeSpan(Date maxTime, Date startTime, String unit) { long um= Math.abs(maxTime.getTime()-startTime.getTime()); if(MINUTE.equals(unit)){ um=um/(1000*60); } return um; } /** * 根据单位计算目标日期 * * @param num 距离 * @param unit 日期单位 Y/M/D * @return */ public static Date calDate(Integer num, String unit) { Calendar calendar = Calendar.getInstance(); Date targetDate = null; switch (unit) { case "Y": calendar.add(Calendar.YEAR, num); targetDate = calendar.getTime(); break; case "M": calendar.add(Calendar.MONTH, num); targetDate = calendar.getTime(); break; case "D": calendar.add(Calendar.DAY_OF_MONTH, num); targetDate = calendar.getTime(); break; default: targetDate = stringToDate("9999-12-31", DATE_FORMAT_DD); } return targetDate; } public static String getAgeForBirthDay(Date birthDay) { Calendar cal = Calendar.getInstance(); if (birthDay == null) { return "-"; } // 出生日期晚于当前时间,无法计算 if (cal.before(birthDay)) { return "-"; } // 当前年份 int yearNow = cal.get(Calendar.YEAR); // 当前月份 int monthNow = cal.get(Calendar.MONTH); // 当前日期 int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); cal.setTime(birthDay); int yearBirth = cal.get(Calendar.YEAR); int monthBirth = cal.get(Calendar.MONTH); int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); // 计算整岁数 Integer age = yearNow - yearBirth; if (monthNow <= monthBirth) { if (monthNow == monthBirth) { if (dayOfMonthNow < dayOfMonthBirth) { // 当前日期在生日之前,年龄减一 age--; } } else { age--; } } return age.toString(); } }