zhangherong
2025-06-25 23855599412c4d61b38d78f0f3abd3430a48b5b1
lxzn-module-mdc-common/src/main/java/org/jeecg/modules/mdc/util/DateUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1115 @@
package org.jeecg.modules.mdc.util;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoField;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DateUtils {
    private final static long DAYTIMESUNSET = 86400;
    /**
     * @return å¾—到明天
     */
    public static Date getNextDay(Date d1) {
        long d2 = d1.getTime() + 86400 * 1000;
        return new Date(d2);
    }
    /**
     * @return å¾—到昨天
     */
    public static Date getPreviousDay(Date d1) {
        long d2 = d1.getTime() - 86400 * 1000;
        return new Date(d2);
    }
    /**
     * @return è¿”回时间差的语言描述  å¦‚1天2小时5分6秒
     */
    public static String different(Date d1, Date d2) {
        if (d1 == null || d2 == null) {
            return "";
        }
        StringBuilder strB = new StringBuilder();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            //毫秒ms
            long diff = d2.getTime() - d1.getTime();
            long diffSeconds = diff / 1000 % 60;
            long diffMinutes = diff / (60 * 1000) % 60;
            long diffHours = diff / (60 * 60 * 1000) % 24;
            long diffDays = diff / (24 * 60 * 60 * 1000);
            if (diffDays > 0) {
                strB.append(diffDays + " å¤© ");
                strB.append(diffHours + " å°æ—¶ ");
                strB.append(diffMinutes + " åˆ†é’Ÿ ");
                strB.append(diffSeconds + " ç§’ ");
            } else if (diffHours > 0) {
                strB.append(diffHours + " å°æ—¶ ");
                strB.append(diffMinutes + " åˆ†é’Ÿ ");
                strB.append(diffSeconds + " ç§’ ");
            } else if (diffMinutes > 0) {
                strB.append(diffMinutes + " åˆ†é’Ÿ ");
                strB.append(diffSeconds + " ç§’ ");
            } else {
                strB.append(diffSeconds + " ç§’ ");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return strB.toString();
    }
    /**
     * @return èŽ·å–ä¸¤ä¸ªdate的时间差,结果为秒 é™¤
     */
    public static long differentSecond(Date startDate, Date endDate) {
        return new BigDecimal(endDate.getTime() - startDate.getTime()).divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_HALF_UP).longValue();
//        return (endDate.getTime() - startDate.getTime()) / 1000;
    }
    /**
     * @return èŽ·å–ä¸¤ä¸ªdate的时间差,结果为分钟
     */
    public static Integer differentMinutes(Date startDate, Date endDate) {
        return new BigDecimal(endDate.getTime() - startDate.getTime()).divide(new BigDecimal("60000"), 0, RoundingMode.HALF_UP).intValue();
    }
    /**
     * @return è¿”回传入时间的0点0分0秒
     */
    public static Date getTodayZero(Date d) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return cal.getTime();
    }
    /**
     * @return è¿”回传入时间的0点0分0秒
     */
    public static Date getTomorrowZero(Date d) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(d);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.add(Calendar.DAY_OF_MONTH, 1);
        return cal.getTime();
    }
    /**
     * @return åˆ¤æ–­æ—¶é—´æ˜¯å¦æ˜¯å½“天
     */
    public static boolean isTaday(Date date) {
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        String nowDay = sf.format(now);
        String day = sf.format(date);
        return day.equals(nowDay);
    }
    /**
     * @return åˆ¤æ–­ä¸¤ä¸ªæ—¶é—´æ˜¯å¦ä¸ºåŒä¸€å¤©
     */
    public static boolean isOneDay(Date d1, Date d2) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        String d1Str = sf.format(d1);
        String d2Str = sf.format(d2);
        return d1Str.equals(d2Str);
    }
    /**
     * @return åˆ¤æ–­ä¸¤ä¸ªæ—¶é—´æ˜¯å¦ä¸ºåŒä¸€å¹´
     */
    public static boolean isOneYear(Date d1, Date d2) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy");
        String d1Str = sf.format(d1);
        String d2Str = sf.format(d2);
        return d1Str.equals(d2Str);
    }
    public static String dateProportion(Date start, Date end) {
        float differentSecond = DateUtils.differentSecond(start, end);
        float f = differentSecond / DAYTIMESUNSET * 100;
        return String.format("%.2f", f) + "%";
    }
    public static Date strToDate(String dateStr, String format) {
        SimpleDateFormat sf = new SimpleDateFormat(format);
        Date result = null;
        try {
            result = sf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return result;
    }
    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 STRYEARMONTH = "yyyyMM";
    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";
    public static final String STR_MMDD = "MM-dd";
    /**
     * <p>
     * Description: å®žé™…投标月份
     * </p>
     *
     * @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;
    }
    /**
     * <p>
     * Description: ä¿®æ”¹æ—¶é—´ä¸ºæŒ‡å®šæ—¶é—´å½“天的23:59:59.000
     * </p>
     *
     * @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;
    }
    /**
     * <p>
     * Description: ä¿®æ”¹æ—¶é—´ä¸ºæŒ‡å®šæ—¶é—´å‰ä¸€å¤©çš„00:00:00
     * </p>
     *
     * @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();
    }
    /**
     * <p>
     * Description: åŽ»æŽ‰æ—¥æœŸæ—¶é—´ä¸­çš„æ—¶é—´éƒ¨åˆ†
     * </p>
     * å¦‚: 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;
    }
    /**
     * <p>
     * Description: æŒ‰é»˜è®¤æ ¼å¼(yyyy-MM-dd HH:mm:ss.SSS)获取时间字符串
     * </p>
     *
     * @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;
    }
    /**
     * <p>
     * Description: æŒ‰æŒ‡å®šæ ¼å¼èŽ·å–æ—¶é—´å­—ç¬¦ä¸²
     * </p>
     *
     * @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);
    }
    /**
     * <p>
     * Description: åŠ æœˆå‡½æ•°
     * </p>
     *
     * @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) {
        try {
            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();
        } catch (Exception e) {
            return 0;
        }
    }
    //获取小时差
    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 = DateUtils.removeTime(startTime);
            //获得到本月的最后一天
            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
            endsTime = calendar.getTime();
            endsTime = DateUtils.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 = DateUtils.removeTime(startTime);
            //获得到本月的最后一天
            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
            endsTime = calendar.getTime();
            endsTime = DateUtils.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 = DateUtils.fillTime(yearLast);
        return lastYear;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyy-MM-dd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringList(Date start, Date end, String strDate) {
        List<String> list = new ArrayList<>();
        int i = getDays(start, end);
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                list.add(format(start, strDate));
            } else {
                list.add(format(plusTime(start, j), strDate));
            }
        }
        return list;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyy-MM-dd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringList(Date start, Date end) {
        List<String> 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;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼yyyyMMdd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringList2(Date start, Date end) {
        List<String> list = new ArrayList<>();
        int i = getDays(start, end);
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                list.add(format(start, STRDATE));
            } else {
                list.add(format(plusTime(start, j), STRDATE));
            }
        }
        return list;
    }
    /**
     * èŽ·å–start/end的所有日期字符串 æ ¼å¼MM-dd
     *
     * @param start
     * @param end
     * @return
     */
    public static List<String> getDatesStringLists(Date start, Date end) {
        List<String> list = new ArrayList<>();
        int i = getDays(start, end);
        for (int j = 0; j <= i; j++) {
            if (j == 0) {
                list.add(format(start, STR_MMDD));
            } else {
                list.add(format(plusTime(start, j), STR_MMDD));
            }
        }
        return list;
    }
    public static List<String> getMonthBetween(Date start, Date end) {
        List<String> 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;
    }
    /**
     * èŽ·å–dateStr的日期格式yyyyMMdd
     *
     * @param dateStr
     * @return
     */
    public static Date getShortDate2(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat(STRDATE);
        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<String> getDateMonth(String start, String end) {
        List<String> 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<String> getDateYear(String start, String end) {
        List<String> 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<Date> getHourDateList(Date time) {
        List<Date> 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 DateUtils.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 secToTimeHour(int time) {
        String timeStr = null;
        int hour = 0;
        if (time <= 0) {
            return "0小时";
        } else {
            BigDecimal bigDecimal = new BigDecimal(time);
            BigDecimal bigDecimal1 = new BigDecimal(3600);
            BigDecimal hourBigDecimal = new BigDecimal(0);
            hourBigDecimal = new BigDecimal(String.valueOf(bigDecimal)).
                    divide(new BigDecimal(String.valueOf(bigDecimal1)), 2, BigDecimal.ROUND_HALF_UP);
            timeStr = hourBigDecimal + "小时";
        }
        return timeStr;
    }
    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;
    }
    public static Date setTimeForDay(Date theDate, String planTime) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(theDate);
        String[] times = planTime.split(":");
        cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(times[0]));
        cal.set(Calendar.MINUTE, Integer.parseInt(times[1]));
        cal.set(Calendar.SECOND, Integer.parseInt(times[2]));
        return cal.getTime();
    }
    public static long getTimeWithOutDay(Date d) {
        return d.getTime() / 1000 % 86400;
    }
    /**
     * @param lo æ¯«ç§’æ•°
     * @return String yyyy-MM-dd HH:mm:ss
     * @Description: long类型转换成日期
     */
    public static String longToDate(long lo) {
        Date date = new Date(lo);
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sd.format(date);
    }
    /**
     * @param startDate
     * @param endDate
     * @return
     */
    public static List<Date> getWeekDays(LocalDate startDate, LocalDate endDate) {
        List<Date> result = new ArrayList<>();
        List<LocalDate> dateList = Stream.iterate(startDate, localDate -> localDate.plusDays(1))
                .limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
                .filter(localDate -> DayOfWeek.SATURDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))) || DayOfWeek.SUNDAY.equals(DayOfWeek.of(localDate.get(ChronoField.DAY_OF_WEEK))))
                .collect(Collectors.toList());
        dateList.forEach(localDate -> result.add(Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant())));
        return result;
    }
    /**
     * @param smallDate
     * @param bigDate
     * @desc èŽ·å–ä¸¤ä¸ªæ—¥æœŸä¹‹é—´çš„å¤©æ•°
     */
    public static Integer getDaysBetween(String smallDate, String bigDate) throws ParseException {
        // æ—¥æœŸæ ¼å¼
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        // èŽ·å–ä¸¤ä¸ªæ—¥æœŸçš„æ—¶é—´æˆ³
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(smallDate));
        long smallTime = cal.getTimeInMillis();
        cal.setTime(sdf.parse(bigDate));
        long bigTime = cal.getTimeInMillis();
        // ç›¸å·®çš„æ—¥æœŸ
        long days = (bigTime - smallTime) / (1000 * 3600 * 24);
        // long转int å­˜åœ¨æº¢å‡ºæƒ…况  æ ¹æ®ä¸šåŠ¡æƒ…å†µç¼–è¾‘catch中返回值
        try {
            return Integer.parseInt(String.valueOf(days));
        } catch (NumberFormatException e) {
            e.printStackTrace();
            return 0;
        }
    }
    /**
     * æ—¥æœŸè½¬æ¢ï¼Œå°†æŽ¥å£è¿”回的20180524转为2018-05-24
     *
     * @param str
     * @return
     */
    public static String dateConvertion(String str) {
        Date parse = null;
        String dateString = "";
        try {
            parse = new SimpleDateFormat("yyyyMMdd").parse(str);
            dateString = new SimpleDateFormat("yyyy-MM-dd").format(parse);
        } catch (ParseException e) {
            dateString = null;
        }
        return dateString;
    }
    /**
     * Date与LocalDateTime互相转换的工具方法
     *
     * @param date
     * @return
     */
    public static LocalDateTime convertToLocalDateTime(Date date) {
        if (date == null) {
            return null;
        }
        return Instant.ofEpochMilli(date.getTime())
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
    }
    /**
     * Date与LocalDateTime互相转换的工具方法
     *
     * @param localDateTime
     * @return
     */
    public static Date convertToDate(LocalDateTime localDateTime) {
        if (localDateTime == null) {
            return null;
        }
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }
}