|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 日期格式化,转换工具类 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @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_MONGO = "yyyy-MM-dd'T'HH:mm:ss.SSS"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static final String DATE_FORMAT_STS = "yyyy-MM-dd'T'HH:mm:ss"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 返回年份 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | *            日期 | 
|---|
|  |  |  | * @return 返回年份 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 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 返回月份 | 
|---|
|  |  |  | 
|---|
|  |  |  | c.setTime(date); | 
|---|
|  |  |  | return c.get(Calendar.MONTH) + 1; | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return 0; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 日期转字符串 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @param format | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 字符串转日期 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param dateStr | 
|---|
|  |  |  | * @param format | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  | 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 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 指定时间的下一天 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  | cal.add(Calendar.DATE, 1); | 
|---|
|  |  |  | return cal.getTime(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 指定时间的前一天 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  | cal.add(Calendar.DATE, -1); | 
|---|
|  |  |  | return cal.getTime(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 指定时间的下N天 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  | cal.add(Calendar.DATE, nDay); | 
|---|
|  |  |  | return cal.getTime(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 指定时间的前N天 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  | cal.add(Calendar.DATE, -nDay); | 
|---|
|  |  |  | return cal.getTime(); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取一天的起始时间 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | return fmt.parse(dateStr); | 
|---|
|  |  |  | } catch (ParseException e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return date; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取一天的结束时间 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | return fmt.parse(dateStr); | 
|---|
|  |  |  | } catch (ParseException e) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return date; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * currentDat是否在referenceDate日期之前 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param referenceDate | 
|---|
|  |  |  | * @param currentDat | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * currentDat是否在referenceDate日期之后 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param referenceDate | 
|---|
|  |  |  | * @param currentDat | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return currentDate.after(referenceDate); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public static long getDifTimeMin(Date beginTime,Date endTime){ | 
|---|
|  |  |  | return (endTime.getTime()-beginTime.getTime())/1000/ 60; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | public static List<Date> getFutureDay(Date date, int start,int end){ | 
|---|
|  |  |  | List<Date> dates=new ArrayList<Date>(); | 
|---|
|  |  |  | 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 false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取startDate到endDate之间的星期day(中文星期)不包括startDate和endDate | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param startDate | 
|---|
|  |  |  | * @param endDate | 
|---|
|  |  |  | * @param day | 
|---|
|  |  |  | 
|---|
|  |  |  | return listDate; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * date转换成Timestamp | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @param format | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取早中晚 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param time | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取早中晚的开始时间 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @param time | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取早中晚的结束时间 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @param time | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 得到几天前的时间 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param d | 
|---|
|  |  |  | * @param day | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 得到几天后的时间 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param d | 
|---|
|  |  |  | * @param day | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 将日期类型格式化成字符串 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param date | 
|---|
|  |  |  | * @return 格式化后日期字符串 | 
|---|
|  |  |  | * @throws ParseException | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取时间戳 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public static String getTimeMark() { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|