package com.mm.util; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Pattern; /** * Created by Administrator on 2015/8/28. */ public class DateUtil { public static final String STR_DATE_STRING = "yyyy_MM_dd"; public static final String STR_DATE = "yyyy-MM-dd"; public static final String STRDATE = "yyyyMMdd"; public static final String STR_YEAR_MONTH = "yyyy-MM"; public static final String STR_DATE_TIME = "yyyy-MM-dd HH:mm:ss.SSS"; public static final String STR_DATE_TIME_SMALL = "yyyy-MM-dd HH:mm:ss"; public static final String STR_DATE_TIME_MIN = "yyyy-MM-dd HH:mm"; public static final String STR_DATE_TIME_HOUR = "yyyy-MM-dd HH"; public static final String STR_DATE_TIME_FULL = "yyyyMMddHHmmssSSS"; public static final String STR_HHMMSS = "HH:mm:ss"; public static final String STR_HHMM = "HH:mm"; /** *

* Description: 实际投标月份 *

* * @param startDate * @param endDate * @return obj [0] 实际投标月份 例如实际投标月份(3.86)意义是3个月又26天 obj[1] 实际取整月份 (3) */ public static Integer getRealMonth(Date startDate, Date endDate) { Integer month = 0; Calendar start = Calendar.getInstance(); start.setTime(startDate); Calendar end = Calendar.getInstance(); end.setTime(endDate); int year = start.get(Calendar.YEAR); int year2 = end.get(Calendar.YEAR); int month2 = start.get(Calendar.MONTH); int month3 = end.get(Calendar.MONTH); try { while (start.before(end)) { start.add(Calendar.MONTH, 1); month++; } } catch (Exception e) { e.printStackTrace(); } int day2 = start.get(Calendar.DAY_OF_MONTH); int day3 = end.get(Calendar.DAY_OF_MONTH); int tmpYear = year2 - year; if (day2 == day3) { return (tmpYear * 12) + (month3 - month2); } return month == 0 ? month : (month - 1); } public static Date getNow() { return new Date(System.currentTimeMillis()); } public static int getDayOfMonth() { Calendar aCalendar = Calendar.getInstance(Locale.CHINA); int day = aCalendar.getActualMaximum(Calendar.DATE); return day; } /** *

* Description: 修改时间为指定时间当天的23:59:59.000 *

* * @param date * 需要修改的时间 * @return 修改后的时间 */ public static Date fillTime(Date date) { Date result = removeTime(date); result.setTime(result.getTime() + 24 * 60 * 60 * 1000 - 1000); // 加一天 return result; } /** * @param date * 当前时间 * @param i * 往前几天 * @return */ public static Date fillBeforeTime(Date date, Integer i) { Date result = removeTime(date); Calendar calendar = Calendar.getInstance(); // 得到日历 calendar.setTime(result);// 把当前时间赋给日历 calendar.add(Calendar.DAY_OF_MONTH, i); // 设置为前一天 result.setTime(calendar.getTime().getTime() + 24 * 60 * 60 * 1000 - 1000); // 加一天 return result; } /** *

* Description: 修改时间为指定时间前一天的00:00:00 *

* * @param date * 需要修改的时间 * @return 修改后的时间 */ public static Date plusTime(Date date, Integer i) { Date result = removeTime(date); Calendar calendar = Calendar.getInstance(); // 得到日历 calendar.setTime(result);// 把当前时间赋给日历 calendar.add(Calendar.DAY_OF_MONTH, i); // 设置为前一天 return calendar.getTime(); } /** *

* Description: 去掉日期时间中的时间部分 *

* 如: 2013-11-11 18:56:33 ---> 2013-11-11 00:00:00 * * @param date * 需要修改的时间 * @return 修改后的时间 */ public static Date removeTime(Date date) { Date result = null; try { SimpleDateFormat df = new SimpleDateFormat(STR_DATE); String dateStr = df.format(date); result = df.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return result; } /** *

* Description: 按默认格式(yyyy-MM-dd HH:mm:ss.SSS)获取时间字符串 *

* * @param date * 要转换的日期 * @return 转换后的时间字符串 */ public static String format(Date date) { SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME); return df.format(date); } public static Date parseDate(Date date,String format){ SimpleDateFormat df = new SimpleDateFormat(format); try { date = df.parse(df.format(date)); } catch (ParseException e) { e.printStackTrace(); } return date; } public static Date getDelayedYear(){ Calendar curr = Calendar.getInstance(); curr.set(Calendar.YEAR,curr.get(Calendar.YEAR)+1); Date date=curr.getTime(); return date; } /** *

* Description: 按指定格式获取时间字符串 *

* * @param date * 要转换的日期 * @param format * 格式,例如:yyyy-MM-dd HH:mm:ss.SSS * @return 转换后的时间字符串 */ public static String format(Date date, String format) { SimpleDateFormat df = new SimpleDateFormat(format); return df.format(date); } /** *

* Description: 加月函数 *

* * @param month * 月份数 * @return */ public static Date addMonth(Integer month, Date time) { Calendar c = Calendar.getInstance(); c.setTime(time); c.add(Calendar.MONTH, month); return c.getTime(); } public static Boolean greater(Date startTime, Date endTime) { return startTime.getTime() > endTime.getTime(); } public static Boolean less(Date startTime, Date endTime) { return startTime.getTime() < endTime.getTime(); } public static Boolean equals(Date startTime, Date endTime) { return startTime.getTime() == endTime.getTime(); } public static Integer getDiffMonth(Calendar c, Calendar c1) { return (c.get(Calendar.YEAR) - c1.get(Calendar.YEAR)) * 12 + (c.get(Calendar.MONTH) - c1.get(Calendar.MONTH)); } /** * 是否为同一天 */ public static boolean equalsDay(Date a, Date b) { return removeTime(a).getTime() == removeTime(b).getTime(); } public static Integer getDays(Date startTime, Date endTime) { Calendar c = Calendar.getInstance(); c.setTime(startTime); Calendar c1 = Calendar.getInstance(); c1.setTime(endTime); long t1 = c.getTimeInMillis(); long t2 = c1.getTimeInMillis(); // 计算天数 Long days = (t2 - t1) / (24 * 60 * 60 * 1000); return days.intValue(); } public static Integer getSeconds(Date startTime, Date endTime) { Calendar c = Calendar.getInstance(); c.setTime(startTime); Calendar c1 = Calendar.getInstance(); c1.setTime(endTime); long t1 = c.getTimeInMillis(); long t2 = c1.getTimeInMillis(); // 计算秒数 Long days = (t2 - t1) / (1000); return days.intValue(); } //获取小时差 public static double subHours(Date startTime, Date endTime) { Calendar c = Calendar.getInstance(); c.setTime(startTime); Calendar c1 = Calendar.getInstance(); c1.setTime(endTime); double t1 = c.getTimeInMillis(); double t2 = c1.getTimeInMillis(); // 计算天数 double hours = (t2 - t1) / (1000 * 60 * 60); return Double.valueOf(new DecimalFormat("#.00").format(hours)); } //根据当前时间和出生日期获取年龄 public static int getAge(Date birthDay){ Calendar cal = Calendar.getInstance(); // 取出系统当前时间的年、月、日部分 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); // 当前年份与出生年份相减,初步计算年龄 int age = yearNow - yearBirth; // 当前月份与出生日期的月份相比,如果月份小于出生月份,则年龄上减1,表示不满多少周岁 if (monthNow <= monthBirth){ // 如果月份相等,在比较日期,如果当前日,小于出生日,也减1,表示不满多少周岁 if (monthNow == monthBirth){ if (dayOfMonthNow < dayOfMonthBirth) age--; }else { age--; } } return age; } public static Date subDays(Date startTime, Integer day) { Calendar c = Calendar.getInstance(); c.setTime(startTime); c.add(Calendar.DATE, day * -1); return c.getTime(); } public static Date addDays(Date startTime, Integer day) { Calendar c = Calendar.getInstance(); c.setTime(startTime); c.add(Calendar.DATE, day ); return c.getTime(); } /*public static Date addHours(Date startTime, Integer hours) { Calendar c = Calendar.getInstance(); c.setTime(startTime); c.add(Calendar.HOUR, hours ); return c.getTime(); }*/ public static Date toDate(String date, String format){ SimpleDateFormat df = new SimpleDateFormat(format); try { return df.parse(date); } catch (ParseException e) { e.printStackTrace(); } return null; } public static Date toDateFull(String date){ SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME); try { return df.parse(date); } catch (ParseException e) { e.printStackTrace(); } return null; } public static Date toDateMedium(String date){ SimpleDateFormat df = new SimpleDateFormat(STR_DATE_TIME_SMALL); try { Date dd = df.parse(date); return dd; } catch (ParseException e) { return null; } } public static Integer getDate(Date date) { if (date != null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int day = calendar.get(Calendar.DATE); return day; } return null; } public static Integer getYear() { return getYear(new Date()); } public static Integer getYear(Date date) { if (date != null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int year = calendar.get(Calendar.YEAR); return year; } return null; } public static Integer getMonth() { return getMonth(new Date()); } public static Integer getMonth(Date date) { if (date != null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int month = calendar.get(Calendar.MONTH); return month+1; } return null; } public static Integer getDay() { return getDay(new Date()); } public static Integer getDay(Date date) { if (date != null) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int day = calendar.get(Calendar.DAY_OF_MONTH); return day; } return null; } public static Date[] getMonthStartTimeAndEndTime(Integer month){ Calendar calendar = Calendar.getInstance(); Date[] dates = new Date[2]; Date startTime = null; Date endsTime = null; if(month != null){ calendar.set(Calendar.MONTH, month); //获得到本月的第一天 calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); startTime = calendar.getTime(); startTime = DateUtil.removeTime(startTime); //获得到本月的最后一天 calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); endsTime = calendar.getTime(); endsTime = DateUtil.fillTime(endsTime); } dates[0] = startTime; dates[1] = endsTime; return dates; } public static Date[] getMonthStartTimeAndEndTime(Date date){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Integer month = calendar.get(Calendar.MONTH); Date[] dates = new Date[2]; Date startTime = null; Date endsTime = null; if(month != null){ calendar.set(Calendar.MONTH, month); //获得到本月的第一天 calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); startTime = calendar.getTime(); startTime = DateUtil.removeTime(startTime); //获得到本月的最后一天 calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); endsTime = calendar.getTime(); endsTime = DateUtil.fillTime(endsTime); } dates[0] = startTime; dates[1] = endsTime; return dates; } /** * 获取days天的时间区间,endTime 为当天的后一天0点, * startTime 为endTime前days天 * @param days * @return */ public static Date[] getDaysStartTimeAndEndTime(Integer days) { Date[] dates = new Date[2]; Date endDate = plusTime(removeTime(getNow()), 1); Date startDate = subDays(endDate, days); dates[0] = startDate; dates[1] = endDate; return dates; } /** * 根据某一年获取最后一天的时间 * 2013 ---> 2013-12-31 23:59:59.000 * @param year * @return */ public static Date getYearEndDay(Integer year) { Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR, year); calendar.roll(Calendar.DAY_OF_YEAR, -1); Date yearLast = calendar.getTime(); Date lastYear = DateUtil.fillTime(yearLast); return lastYear; } /** * 获取start/end的所有日期字符串 格式yyyy-MM-dd * @param start * @param end * @return */ public static List getDatesStringList(Date start, Date end) { List list = new ArrayList<>(); int i = getDays(start, end); for(int j = 0; j <= i; j++) { if(j == 0) { list.add(format(start, STR_DATE)); } else { list.add(format(plusTime(start, j), STR_DATE)); } } return list; } public static List getMonthBetween(Date start, Date end){ List list = new ArrayList<>(); Calendar min = Calendar.getInstance(); Calendar max = Calendar.getInstance(); min.setTime(start); min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1); max.setTime(end); max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2); Calendar curr = min; while (curr.before(max)){ list.add(format(curr.getTime(),STR_YEAR_MONTH)); curr.add(Calendar.MONTH,1); } return list; } /** * 获取dateStr的日期格式yyyy-MM-dd * @param dateStr * @return */ public static Date getShortDate(String dateStr) { SimpleDateFormat sdf = new SimpleDateFormat(STR_DATE); Date startTime = null; try { startTime = sdf.parse(dateStr); } catch (ParseException e) { } return startTime == null ? removeTime(new Date()) : startTime; } public static Date getFormatDate(String dateStr,String format) { SimpleDateFormat sdf = new SimpleDateFormat(format); Date startTime = null; try { startTime = sdf.parse(dateStr); } catch (ParseException e) { } return startTime == null ? removeTime(new Date()) : startTime; } /** * * @param time * @param n * @return 在一个时间上加秒 */ public static Date addSecond(Date time,Integer n) { Calendar c = Calendar.getInstance(); c.setTime(time); c.add(Calendar.SECOND, n); return c.getTime(); } /** * * @param time * @param n * @return 在一个时间上加分钟 */ public static Date addMinute(Date time,Integer n) { Calendar c = Calendar.getInstance(); c.setTime(time); c.add(Calendar.MINUTE, n); return c.getTime(); } /** * * @param time * @param n * @return 在一个时间上加小时 */ public static Date addHour(Date time,Integer n) { Calendar c = Calendar.getInstance(); c.setTime(time); c.add(Calendar.HOUR_OF_DAY, n); return c.getTime(); } /** * 获取start/end的所有日期字符串 格式yyyy-MM-dd * @param start * @param end * @return */ public static List getDateMonth(String start, String end) { List list = new ArrayList<>(); SimpleDateFormat yyyyMM = new SimpleDateFormat("yyyy-MM"); Date startyear = null; try { startyear = yyyyMM.parse(start); Date endyear = yyyyMM.parse(end); Calendar dd = Calendar.getInstance();//定义日期实例 dd.setTime(startyear);//设置日期起始时间 while (dd.getTime().before(endyear)) {//判断是否到结束日期 String str = yyyyMM.format(dd.getTime()); dd.add(Calendar.MONTH, 1);//进行当前日期月份加1 list.add(str); } list.add(yyyyMM.format(endyear)); } catch (ParseException e) { e.printStackTrace(); } return list; } /** * 获取start/end的所有日期字符串 格式yyyy * @param start * @param end * @return */ public static List getDateYear(String start, String end) { List list = new ArrayList<>(); SimpleDateFormat yyyy = new SimpleDateFormat("yyyy"); Date startyear = null; try { startyear = yyyy.parse(start); Date endyear = yyyy.parse(end); Calendar dd = Calendar.getInstance();//定义日期实例 dd.setTime(startyear);//设置日期起始时间 while (dd.getTime().before(endyear)) {//判断是否到结束日期 String str = yyyy.format(dd.getTime()); dd.add(Calendar.YEAR, 1);//进行当前日期月份加1 list.add(str); } list.add(yyyy.format(endyear)); } catch (ParseException e) { e.printStackTrace(); } return list; } /** * 获取当前时间 定位到小时 * 格式为 yyyy-MM-dd hh:mm * 例:2018-02-27 11:00 * @return */ public static Date getNowHourDate() { Date now = getNow(); Date result; Calendar calendar = Calendar.getInstance(); calendar.setTime(now); int hour = calendar.get(Calendar.HOUR_OF_DAY); String dateStr = format(now, STR_DATE); dateStr = dateStr + " " + (hour < 10 ? "0" + hour : hour) + ":00"; result = toDate(dateStr, STR_DATE_TIME_MIN); return result; } /** * 获取每日8:11或11:11的时间点 * @return */ public static Date getNowHourDateTo() { Date now = getNow(); Date result; Calendar calendar = Calendar.getInstance(); calendar.setTime(now); int hour = calendar.get(Calendar.HOUR_OF_DAY); if(hour != 8 && hour != 11) { return null; } int minute = calendar.get(Calendar.MINUTE); if(minute < 11) { return null; } String dateStr = format(now, STR_DATE); dateStr = dateStr + " " + (hour < 10 ? "0" + hour : hour) + ":11"; result = toDate(dateStr, STR_DATE_TIME_MIN); return result; } /** * 获取每日8:00、13:00、20:00的时间点 * @return */ public static List getHourDateList(Date time) { List result = new ArrayList<>(); result.add(addHour(time,8)); result.add(addHour(time,13)); result.add(addHour(time,20)); return result; } /** * 获取上月的最后一天 * @return */ public static Date getPreviousMonthLastDay() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, 0); return DateUtil.removeTime(calendar.getTime()); } /** * 获取end时间月的第一天 * @param end 月份最后一天 * @return */ public static Date getTheMonthFirstDay(Date end) { Calendar calendar = Calendar.getInstance(); calendar.setTime(end); calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar.getTime(); } public static String secToTime(int time) { String timeStr = null; int hour = 0; int minute = 0; int second = 0; if (time <= 0) return " "; else { minute = time / 60; if (minute < 60) { second = time % 60; timeStr = unitFormat(minute) + "分" + unitFormat(second) + " 秒"; } else { hour = minute / 60; minute = minute % 60; second = time - hour * 3600 - minute * 60; timeStr = unitFormat(hour) + "小时" + unitFormat(minute) + "分" + unitFormat(second) + "秒"; } } return timeStr; } public static String unitFormat(int i) { String retStr = null; if (i >= 0 && i < 10) retStr = "0" + Integer.toString(i); else retStr = "" + i; return retStr; } /** * 验证时间 * * @param time 时间字符串 HH:mm * @return 验证成功返回true,验证失败返回false */ public static boolean checkTime(String time) { String regex = "([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"; return Pattern.matches(regex, time); } /** * 获取每日07:30:00的时间点 * 格式为 yyyy-MM-dd HH:mm:ss * 例:2018-05-28 07:30:00 * * @return */ public static Date getHourDateTo(Date now, String time) { String dateStr = format(now, STR_DATE); dateStr = dateStr + " " + time; Date result = toDate(dateStr, STR_DATE_TIME_SMALL); return result; } }