public class DateTimeUtil {

    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static final String YYYY_MM_DD = "yyyy-MM-dd";
    public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
    public static final String YYYYMMDD = "yyyyMMdd";
    public static final String YYYYMM = "yyyyMM";
    public static final String YYYY_MM = "yyyy-MM";
    private static Map<String, ThreadLocal<DateFormat>> FORMAT_CACHE = new ConcurrentHashMap<String, ThreadLocal<DateFormat>>();
    

    /**
     * 获取DateFormat实例(线程安全)
     *
     * @param pattern
     * @return
     */
    public static DateFormat getDateFormat(String pattern) {

        ThreadLocal<DateFormat> threadLocal = FORMAT_CACHE.get(pattern);
        if (threadLocal == null) {
            threadLocal = new ThreadLocal<DateFormat>();
            DateFormat format = new SimpleDateFormat(pattern);
            threadLocal.set(format);
            FORMAT_CACHE.put(pattern, threadLocal);
        }
        return threadLocal.get();

    }

    /**
     * 获取系统当前时间
     *
     * @return
     */
    public static String getCurrentDate(String pattern) {

        DateFormat format = getDateFormat(pattern);
        return format.format(new Date());

    }

    /**
     * 获取系统当前时间
     *
     * @param pattern
     * @return
     */
    public static long getCurrentDateLong(String pattern) {

        return Long.parseLong(getCurrentDate(pattern));

    }

    /**
     * 获取系统当前时间(默认格式:YYYYMMDDHHMMSS)
     *
     * @return
     */
    public static String getCurrentDate() {

        return getCurrentDate(YYYYMMDDHHMMSS);

    }

    /**
     * 获取系统当前时间(默认格式:YYYYMMDDHHMMSS)
     *
     * @return
     */
    public static long getCurrentDateLong() {

        return getCurrentDateLong(YYYYMMDDHHMMSS);

    }

    /**
     * 获取指定时间的日期(指定分钟和秒)
     *
     * @param minute
     * @param second
     * @param pattern
     * @return
     */
    public static String getDay(int minute, int second, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MINUTE, minute);
        cal.set(Calendar.SECOND, second);
        cal.set(Calendar.MILLISECOND, 0);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定时间月份第一天
     *
     * @param pattern
     * @return
     */
    public static String getMonthFirstDay(String pattern) {

        Calendar cal = Calendar.getInstance();
        cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 0);
        cal.set(Calendar.DAY_OF_MONTH, 1);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定时间月份第一天
     *
     * @param pattern
     * @return
     */
    public static String getMonthFirstDay(Date date, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        cal.add(Calendar.MONTH, 0);
        cal.set(Calendar.DAY_OF_MONTH, 1);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());
    }

    /**
     * 获取指定时间月份第一天
     *
     * @param pattern
     * @return
     */
    public static String getMonthLastDay(String pattern) {

        Calendar cal = Calendar.getInstance();
        cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, 0);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定日期月份最后一天
     * @param date
     * @param pattern
     * @return
     */
    public static String getMonthLastDay(Date date, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        final int last = cal.getActualMinimum(Calendar.DAY_OF_MONTH);

        cal.set(Calendar.DAY_OF_MONTH, last);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());
    }

    /**
     * 获取指定年月的最后一天
     * @param year
     * @param month
     * @return
     */
    public static String getMonthLastDay(int year, int month, String pattern) {
        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR, year);
        //设置月份
        cal.set(Calendar.MONTH, month-1);
        //获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DATE);
        //设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        //格式化日期
        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());
    }

    /**
     * 获取指定时间的日期(指定分钟和秒)
     *
     * @param minute
     * @param second
     * @param pattern
     * @return
     */
    public static long getDayLong(int minute, int second, String pattern) {

        return Long.parseLong(getDay(minute, second, pattern));

    }

    /**
     * 获取指定时间的日期(指定分钟和秒,默认格式:YYYYMMDDHHMMSS)
     *
     * @param minute
     * @param second
     * @return
     */
    public static String getDay(int minute, int second) {

        return getDay(minute, second, YYYYMMDDHHMMSS);

    }

    /**
     * 获取指定时间的日期(指定分钟和秒,默认格式:YYYYMMDDHHMMSS)
     *
     * @param minute
     * @param second
     * @return
     */
    public static long getDayLong(int minute, int second) {

        return getDayLong(minute, second, YYYYMMDDHHMMSS);

    }

    /**
     * 获取指定毫秒之后的时间
     *
     * @param
     * @return
     */
    public static String getNextDate(long miliseconds, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(cal.getTime().getTime() + miliseconds);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定毫秒之后的时间(默认格式:YYYYMMDDHHMMSS)
     *
     * @param miliseconds
     * @return
     */
    public static long getNextDateLong(long miliseconds) {

        return Long.parseLong(getNextDate(miliseconds, YYYYMMDDHHMMSS));

    }

    /**
     * 获取指定毫秒之后的时间
     *
     * @param miliseconds
     * @param pattern
     * @return
     */
    public static long getNextDateLong(long miliseconds, String pattern) {

        return Long.parseLong(getNextDate(miliseconds, pattern));

    }

    /**
     * 获取指定毫秒之后的时间
     *
     * @param
     * @return
     */
    public static String getNextDate(Date date, long miliseconds, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(date.getTime() + miliseconds);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定毫秒之后的时间
     *
     * @param
     * @return
     */
    public static long getNextDateLong(Date date, long miliseconds, String pattern) {

        return Long.parseLong(getNextDate(date, miliseconds, pattern));

    }

    /**
     * 获取指定毫秒之后的时间
     *
     * @param
     * @return
     */
    public static String getNextDate(Date date, long miliseconds) {

        return getNextDate(date, miliseconds, YYYYMMDDHHMMSS);

    }

    /**
     * 获取指定毫秒之后的时间
     *
     * @param
     * @return
     */
    public static long getNextDateLong(Date date, long miliseconds) {

        return Long.parseLong(getNextDate(date, miliseconds));

    }

    /**
     * 获取指定毫秒之前的时间
     *
     * @param
     * @return
     */
    public static String getPreDate(Date date, long miliseconds, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(date.getTime() - miliseconds);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定毫秒之前的时间
     *
     * @param miliseconds
     * @return
     */
    public static long getPreDateLong(Date date, long miliseconds, String pattern) {

        return Long.parseLong(getPreDate(date, miliseconds, pattern));

    }

    /**
     * 获取指定毫秒之前的时间(默认格式:YYYYMMDDHHMMSS)
     *
     * @param miliseconds
     * @return
     */
    public static String getPreDate(Date date, long miliseconds) {

        return getPreDate(date, miliseconds, YYYYMMDDHHMMSS);

    }

    /**
     * 获取指定毫秒之前的时间
     *
     * @param
     * @return
     */
    public static long getPreDateLong(Date date, long miliseconds) {

        return Long.parseLong(getPreDate(date, miliseconds));

    }

    /**
     * 获取指定天之前的时间(默认格式:YYYYMMDD)
     *
     * @param day
     * @return
     */
    public static String getPreDay(int day) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - day);

        DateFormat format = getDateFormat(YYYYMMDD);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定天之前的时间
     *
     * @param day
     * @param pattern
     * @return
     */
    public static String getPreDay(int day, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - day);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }


    /**
     * 获取指定天数前到当前时间的日期数组
     * @param day
     * @return
     */
    public static List<String>  getDayRangeArray(int day) {

        List<String> dates=new ArrayList<>();
        for(int i=0;i<=day;i++){
            dates.add(getPreDay(day-i,YYYY_MM_DD));
        }
        return dates;
    }

    /**
     * 获取指定天之前的时间
     *
     * @param date
     * @param day
     * @return
     */
    public static Date getPreDay(Date date, int day) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - day);
        return cal.getTime();
    }

    /**
     * 获取指定天之前的时间
     *
     * @param date
     * @param day
     * @param pattern
     * @return
     */
    public static String getPreDay(Date date, int day, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) - day);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }


    /**
     * 获取指定年之前的时间
     *
     * @param year
     * @return
     */
    public static String getPreYear(int year, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) - year);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());
    }


    /**
     * 获取指定月之前的时间
     *
     * @param month
     * @return
     */
    public static String getPreMonth(int month) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - month);

        DateFormat format = getDateFormat(YYYYMMDD);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定月之前的时间
     *
     * @param month
     * @return
     */
    public static String getPreMonth(String date, int month, String pattern) throws ParseException {

        Calendar cal = Calendar.getInstance();
        cal.setTime(DateTimeUtil.parse(date, DateTimeUtil.YYYY_MM));
        cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - month);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定月之前的时间
     *
     * @param month
     * @param pattern
     * @return
     */
    public static String getPreMonth(int month, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - month);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定日期之前的月份时间
     * @param date
     * @param month
     * @param pattern
     * @return
     */
    public static String getPreMonth(Date date, int month, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - month);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());
    }

    /**
     * 获取指定月之前的时间
     *
     * @param month
     * @param pattern
     * @return
     */
    public static long getPreMonthLong(int month, String pattern) {

        return Long.parseLong(getPreMonth(month, pattern));

    }

    /**
     * 获取指定天之后的时间
     *
     * @param day
     * @param pattern
     * @return
     */
    public static String getNextDay(int day, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) + day);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定天之后的时间(默认格式:YYYYMMDD)
     *
     * @param day
     * @return
     */
    public static String getNextDay(int day) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.DAY_OF_YEAR, cal.get(Calendar.DAY_OF_YEAR) + day);

        DateFormat format = getDateFormat(YYYYMMDD);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定毫秒之前的时间
     *
     * @param
     * @return
     */
    public static String getPreDate(long miliseconds, String pattern) {

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(cal.getTime().getTime() - miliseconds);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());

    }

    /**
     * 获取指定毫秒之前的时间戳
     *
     * @param
     * @return
     */
    public static long getPreDateTimestamp(long miliseconds) {

        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(cal.getTime().getTime() - miliseconds);

        return cal.getTime().getTime();

    }

    /**
     * 获取指定毫秒之前的时间并返回指定类型值
     *
     * @param miliseconds
     * @param pattern
     * @return
     */
    public static long getPreDateLong(long miliseconds, String pattern) {

        return Long.parseLong(getPreDate(miliseconds, pattern));

    }

    /**
     * 获取指定毫秒之前的时间(默认格式:YYYYMMDDHHMMSS)
     *
     * @param
     * @return
     */
    public static String getPreDate(long miliseconds) {

        return getPreDate(miliseconds, YYYYMMDDHHMMSS);

    }

    /**
     * 获取指定毫秒之前的时间(默认格式:YYYYMMDDHHMMSS)
     *
     * @param miliseconds
     * @return
     */
    public static long getPreDateLong(long miliseconds) {

        return getPreDateLong(miliseconds, YYYYMMDDHHMMSS);

    }

    /**
     * 格式化日期
     *
     * @param date
     * @param pattern
     * @return
     */
    public static String format(Date date, String pattern) {

        return getDateFormat(pattern).format(date);

    }

    /**
     * 格式化日期
     *
     * @param date
     * @param pattern
     * @return
     */
    public static long formatToLong(Date date, String pattern) {

        return Long.parseLong(format(date, pattern));

    }

    /**
     * 格式化日期
     *
     * @param source
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static Date parse(String source, String pattern) throws ParseException {

        return getDateFormat(pattern).parse(source);

    }

    /**
     * 格式化日期
     *
     * @param source
     * @return
     * @throws ParseException
     */
    public static Date parse(String source) throws ParseException {

        return getDateFormat(YYYYMMDD).parse(source);

    }


    /**
     *
     * @param source
     * @param beforePattern
     * @param afterPattern
     * @return
     * @throws ParseException
     */
    public static String parseStr(String source, String beforePattern,String afterPattern) throws ParseException {
        Date date=getDateFormat(beforePattern).parse(source);
        DateFormat format = new SimpleDateFormat(afterPattern);
        return format.format(date);

    }

    /**
     * 判断一个时间是否在一个时间段内
     *
     * @param date
     * @param startDate
     * @param endDate
     * @return
     * @throws ParseException
     */
    public static boolean isInDate(Date date, Date startDate, Date endDate) throws ParseException {

        return date.getTime() >= startDate.getTime() && date.getTime() <= endDate.getTime();

    }

    /**
     * 获取当天的起始时间
     *
     * @return 时间戳
     */
    public static long getCurrentDayStartTime() {

        return getCurrentDayTime(0, 0, 0, 0);

    }

    /**
     * 获取当天的结束时间
     *
     * @return 时间戳
     */
    public static long getCurrentDayEndTime() {

        return getCurrentDayTime(23, 59, 59, 999);

    }

    /**
     * 获取当天的时间
     *
     * @param hour
     * @param minute
     * @param second
     * @param millisecond
     * @return
     */
    public static long getCurrentDayTime(int hour, int minute, int second, int millisecond) {

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        calendar.set(Calendar.MILLISECOND, millisecond);

        return calendar.getTime().getTime();

    }

    /**
     * 获取当天的时间
     *
     * @return
     */
    public static String getCurrentDayTime(int hour, int minute, int second, int millisecond, String pattern) {

        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        calendar.set(Calendar.MILLISECOND, millisecond);

        return format(calendar.getTime(), pattern);

    }


    /**
     * 获取指定周之前周一的时间
     *
     * @param week
     * @param pattern
     * @return
     */
    public static String getPreWeekMonday(int week, String pattern) {


        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, week*7);
        cal.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());
    }
    /**
     * 获取指定周之前周日的时间
     *
     * @param week
     * @param pattern
     * @return
     */
    public static String getPreWeekSunday(int week, String pattern) {


        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, week*7);
        cal.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);

        DateFormat format = getDateFormat(pattern);
        return format.format(cal.getTime());
    }

    /**
     * 时间差-秒
     * @param startDate
     * @param endDate
     * @return
     */
    public static double getDateDifferenceSecond(Date startDate,Date endDate){


        long difference=endDate.getTime()-startDate.getTime();
        double second = (double) difference /  1000;

        return second ;
    }


    public static List<String> getDayRangeArray(String startTime, String endTime) throws ParseException {

        return getDayRangeArray(startTime,endTime,YYYY_MM_DD);
    }

    public static List<String> getDayRangeArray(String startTime, String endTime, String sourcePattern, String outPattern) throws ParseException {

        // 返回的日期集合
        List<String> days = new ArrayList<>();

        Date start = getDateFormat(sourcePattern).parse(startTime);
        Date end = getDateFormat(sourcePattern).parse(endTime);

        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
        while (tempStart.before(tempEnd)) {
            days.add(getDateFormat(outPattern).format(tempStart.getTime()));
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }

        return days;
    }

    /**
     * 获取月
     *
     * @param source
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static int getMonth(String source, String pattern) throws ParseException {

        Date date=getDateFormat(pattern).parse(source);

        Calendar calender = Calendar.getInstance();
        calender.setTime(date);
        return calender.get(Calendar.MONTH)+1;
    }

    /**
     * 获取周
     *
     * @param source
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static int getWeek(String source, String pattern) throws ParseException {

        Date date=getDateFormat(pattern).parse(source);

        Calendar calender = Calendar.getInstance();
        calender.setFirstDayOfWeek(Calendar.MONDAY);
        calender.setTime(date);
        return calender.get(Calendar.WEEK_OF_YEAR);
    }


    /**
     * 获取周区间值
     * @param startTime
     * @param endTime
     * @return
     * @throws ParseException
     */
    public static List<String> getWeekRangeArray(String startTime, String endTime) throws ParseException {

        return getWeekRangeArray(startTime,endTime,YYYY_MM_DD);
    }

    public static List<String> getWeekRangeArray(String startTime, String endTime,String pattern) throws ParseException {

        List<String> weeks = new ArrayList<>();


        Date start = getDateFormat(pattern).parse(startTime);
        Date end = getDateFormat(pattern).parse(endTime);

        Calendar tempStart = Calendar.getInstance();
        tempStart.setFirstDayOfWeek(Calendar.MONDAY);
        tempStart.setTime(start);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        while (tempStart.before(tempEnd)) {
            weeks.add(String.valueOf(tempStart.get(Calendar.WEEK_OF_YEAR)));
            tempStart.add(Calendar.WEEK_OF_YEAR, 1);
        }

        if(tempStart.get(Calendar.WEEK_OF_YEAR)==tempEnd.get(Calendar.WEEK_OF_YEAR)){
            weeks.add(String.valueOf(tempStart.get(Calendar.WEEK_OF_YEAR)));
        }

        return weeks;
    }


    /**
     * 获取月区间值
     * @param startTime
     * @param endTime
     * @return
     * @throws ParseException
     */
    public static List<String> getMonthRangeArray(String startTime, String endTime) throws ParseException {

        return getMonthRangeArray(startTime,endTime,YYYY_MM_DD);
    }

    public static List<String> getMonthRangeArray(String startTime, String endTime,String pattern) throws ParseException {

        List<String> months = new ArrayList<>();


        Date start = getDateFormat(pattern).parse(startTime);
        Date end = getDateFormat(pattern).parse(endTime);

        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);
        tempStart.set(tempStart.get(Calendar.YEAR), tempStart.get(Calendar.MONTH), 1);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        tempEnd.set(tempEnd.get(Calendar.YEAR), tempEnd.get(Calendar.MONTH), 2);
        while (tempStart.before(tempEnd)) {
            months.add(String.valueOf(tempStart.get(Calendar.MONTH)+1));
            tempStart.add(Calendar.MONTH, 1);
        }
        return months;
    }

    /**
     * 获取两个时间的月份差的集合, 结果格式为yyyyMM
     * @param startTime
     * @param endTime
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static List<String> getMonthRangeList(String startTime, String endTime,String pattern) throws ParseException {

        List<String> months = new ArrayList<>();


        Date start = getDateFormat(pattern).parse(startTime);
        Date end = getDateFormat(pattern).parse(endTime);

        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);
        tempStart.set(tempStart.get(Calendar.YEAR), tempStart.get(Calendar.MONTH), 1);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        tempEnd.set(tempEnd.get(Calendar.YEAR), tempEnd.get(Calendar.MONTH), 2);
        while (tempStart.before(tempEnd)) {
            months.add(tempStart.get(Calendar.YEAR) + String.format("%02d", tempStart.get(Calendar.MONTH)+1));
            tempStart.add(Calendar.MONTH, 1);
        }
        return months;
    }

    /**
     * 获取两个时间的月份差的集合, 结果格式为yyyyMM
     * @param startTime
     * @param endTime
     * @param pattern
     * @return
     * @throws ParseException
     */
    public static List<String> getMonthRangeList(String startTime, String endTime,String pattern, String outPattern) throws ParseException {

        List<String> months = new ArrayList<>();

        Date start = getDateFormat(pattern).parse(startTime);
        Date end = getDateFormat(pattern).parse(endTime);

        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);
        tempStart.set(tempStart.get(Calendar.YEAR), tempStart.get(Calendar.MONTH), 1);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        tempEnd.set(tempEnd.get(Calendar.YEAR), tempEnd.get(Calendar.MONTH), 2);
        while (tempStart.before(tempEnd)) {
            months.add(DateTimeUtil.parseStr(tempStart.get(Calendar.YEAR) + String.format("%02d", tempStart.get(Calendar.MONTH) + 1), YYYYMM, outPattern));
//            months.add(tempStart.get(Calendar.YEAR) + String.format("%02d", tempStart.get(Calendar.MONTH)+1));
            tempStart.add(Calendar.MONTH, 1);
        }
        return months;
    }

    public static void main(String[] args) {

        try {
            List<String> ll=getMonthRangeArray("2019-01-26","2020-01-14");

            for (String l:ll){
                System.out.println(l);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取日期间区间日期
     * @param startTime
     * @param endTime
     * @param pattern
     * @return
     * @throws ParseException
     */

    public static List<String> getDayRangeArray(String startTime, String endTime,String pattern) throws ParseException {

        // 返回的日期集合
        List<String> days = new ArrayList<>();

        Date start = getDateFormat(YYYY_MM_DD).parse(startTime);
        Date end = getDateFormat(YYYY_MM_DD).parse(endTime);

        Calendar tempStart = Calendar.getInstance();
        tempStart.setTime(start);

        Calendar tempEnd = Calendar.getInstance();
        tempEnd.setTime(end);
        tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)
        while (tempStart.before(tempEnd)) {
            days.add(getDateFormat(pattern).format(tempStart.getTime()));
            tempStart.add(Calendar.DAY_OF_YEAR, 1);
        }

        return days;
    }


    /**
     * 获取读取数据的起止时间
     * @return 起止时间数组  0:开始时间 1:结束时间
     */
    public static String []  getStartAndEndTime(int beforeSeconds) throws ParseException {


        String endTime=getCurrentDate(YYYY_MM_DD_HH_MM_SS);


        String startTime=getPreDate(getDateFormat(YYYY_MM_DD_HH_MM_SS).parse(endTime),beforeSeconds*1000,YYYY_MM_DD_HH_MM_SS);


        return new String[]{startTime,endTime};
    }

    public static Date converToMongoDBDate(Date date) {

        if (date == null) {
            return DateTimeUtil.getMongoDBDate();
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR_OF_DAY, +8);
        return cal.getTime();
    }

    public static Date getMongoDBDate() {

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        cal.add(Calendar.HOUR_OF_DAY, +8);
        return cal.getTime();

    }

    /**
     * 时间差-天
     * @param startDate
     * @param endDate
     * @return
     */
    public static int daysBetween(String startDate,String endDate,String pattern) throws ParseException {
        SimpleDateFormat sdf=new SimpleDateFormat(pattern);

        Calendar cal = Calendar.getInstance();

        cal.setTime(sdf.parse(startDate));
        long time1 = cal.getTimeInMillis();

        cal.setTime(sdf.parse(endDate));
        long time2 = cal.getTimeInMillis();

        long between_days=(time2-time1)/(1000*3600*24);

        return Integer.parseInt(String.valueOf(between_days));
    }

    public static String getTimeBetweenStr(Date date){
        String result="";
        int day = 0;
        try {
            String start = format(date,DateTimeUtil.YYYY_MM_DD);
            String end = format(new Date(),DateTimeUtil.YYYY_MM_DD);
            day = daysBetween(start,end, DateTimeUtil.YYYY_MM_DD);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if(day>0 && day<365){
            result = day +"天前";
        }else if(day>=365){
            day = day/365;
            result = day +"年前";
        }
        return result;
    }
}