2020-12-29

public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    private static final String DATE_PATTERN = "yyyy-MM-dd";
    private static final String DATE_PATTERN2 = "dd/MM/yyyy";
    private static final String COMPACT_DATE_PATTERN = "yyyyMMdd";
    private static final String COMPACT_TIME_PATTERN = "HHmmss";
    private static final String MM_TIME_PATTERN = "HH:mm";
    private static final String TIME_PATTERN = "HH:mm:ss";
    private static final String MIL_PATTERN = "HH:mm:ss:SSS";
    private static final String TIME_PATTERN_WEEK = "yyyy-MM-dd E";
    private static final String DATE_PATTERN_CN = "yyyy年MM月dd日";
    private static final String DATE_PATTERN_AM_PM = "h:mma 'on' dd/MM/yyyy";
    private static final String IOS8601_PATTERN = "'T'HH:mm:ss.SSS'Z'";


    private DateUtils() {
    }

    private static int AGE_RANGE = 70;

    public static Instant getTodayStartUTC() {
        return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(0, 0, 0)).toInstant(ZoneOffset.UTC);
    }

    public static Instant getTodayEndUTC() {
        return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(23, 59, 59)).toInstant(ZoneOffset.UTC);
    }

    public static Instant getDayStartUTC(String dateAsText, ZoneId zoneId) {
        LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
        return localDate.atStartOfDay().toInstant(ZoneOffset.UTC);
    }

    public static Instant getDayEndUTC(String dateAsText, ZoneId zoneId) {
        LocalDateTime dateTime;
        LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
        LocalTime localTime = LocalTime.of(23, 59, 59);
        dateTime = LocalDateTime.of(localDate, localTime);
        ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
        dateTime = LocalDateTime.ofInstant(zonedDateTime.toInstant(), ZoneOffset.UTC);
        return dateTime.toInstant(ZoneOffset.UTC);
    }

    public static Date getUTCDate() {
        return convertStringToDateTime(getUTCTime(DATE_PATTERN + " " + TIME_PATTERN));
    }

    public static String getUTCTime() {
        return Instant.now().toString();
    }

    public static String getUTCTime(Date date) {
        if (date == null) {
            return null;
        }

        return date.toInstant().atZone(ZoneOffset.UTC).toString();
    }

    public static String getUTCTime(String format) {
        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.now(), ZoneOffset.UTC);
        return dateTime.format(DateTimeFormatter.ofPattern(format));
    }

    public static String getUTCTime(Date date, String format) {
        if (date == null) {
            return null;
        }

        LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC);
        return dateTime.format(DateTimeFormatter.ofPattern(format));
    }

    /**
     * 微博日期格式.
     * 一分钟之内用秒显示,如"4秒前";一个小时内用分钟显示,如"21分钟前";一天内用具体时间显示,如"13:25";当年内用月日显示,如"06月25日 13:25";往年用年月日显示
     * ,如:"2010年5月20日"
     * <p>
     * 大于1天小于7天,显示X天前
     */
    public static String formatDate(Date date) {
        if (null == date) {
            return "";
        }
        Calendar mb = Calendar.getInstance();
        mb.setTime(date);
        int mbMinute = mb.get(Calendar.MINUTE);
        int mbHour = mb.get(Calendar.HOUR_OF_DAY);
        int mbDate = mb.get(Calendar.DATE);
        int mbMonth = mb.get(Calendar.MONTH);
        int mbYear = mb.get(Calendar.YEAR);

        Calendar cur = Calendar.getInstance();
        if (cur.getTimeInMillis() < mb.getTimeInMillis()) {
            cur.setTime(date);// 避免由于服务器时间不同步导致页面时间出现负数
        }
        int curMinute = cur.get(Calendar.MINUTE);
        int curHour = cur.get(Calendar.HOUR_OF_DAY);
        int curDate = cur.get(Calendar.DATE);
        int curMonth = cur.get(Calendar.MONTH);
        int curYear = cur.get(Calendar.YEAR);

        if (curYear > mbYear) {// 往年
            return new SimpleDateFormat("yyyy年MM月dd日").format(date);
        }
        if (mbYear == curYear) {// 当前年
            if (mbMonth == curMonth && mbDate == curDate) {// 一天之内
                if (mbHour == curHour) {// 一小时内
                    if (mbMinute == curMinute) {// 当前分钟
                        int sc = cur.get(Calendar.SECOND) - mb.get(Calendar.SECOND);
                        return (sc == 0 ? 2 : sc) + "秒前";// [KSSP-2681,Fuyx,2011-06-29]
                    }
                    return (cur.get(Calendar.MINUTE) - mb.get(Calendar.MINUTE)) + "分钟前";
                }
                return new SimpleDateFormat("HH:mm").format(date);
            }
//一天前直接显示月日            
//            if (curMonth - mbMonth <= 1) {
//                int days = cur.get(Calendar.DAY_OF_YEAR) - mb.get(Calendar.DAY_OF_YEAR);
//                if (days < 7) {
//                    return days + "天前";
//                }
//            }

            return new SimpleDateFormat("MM月dd日 HH:mm").format(date);
        }
        return "";
    }

    public static List<String> getChoiceYear() {
        List<String> years = new ArrayList<String>();

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());

        int limit = cal.get(Calendar.YEAR) - AGE_RANGE;
        for (int year = cal.get(Calendar.YEAR) - 10; year > limit; year--) {
            years.add(String.valueOf(year));
        }
        return years;
    }

    public static List<String> getChoiceMonth() {
        List<String> months = new ArrayList<String>();

        for (int i = 1; i < 13; i++) {
            if (i < 10)
                months.add("0" + String.valueOf(i));
            else
                months.add(String.valueOf(i));
        }
        return months;
    }

    public static List<String> getChoiceDay() {
        List<String> days = new ArrayList<String>();

        for (int i = 1; i < 32; i++) {
            if (i < 10)
                days.add("0" + String.valueOf(i));
            else
                days.add(String.valueOf(i));
        }
        return days;
    }

    public static Date getDate(String year, String month, String day) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, Integer.parseInt(year));
        cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
        cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day));
        return cal.getTime();
    }

    public static String getYear(Date birthday) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(birthday);
        return String.valueOf(cal.get(Calendar.YEAR));
    }

    public static String getMonth(Date birthday, boolean isZero) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(birthday);
        int month = cal.get(Calendar.MONTH) + 1;
        if (month < 10 && isZero)
            return "0" + String.valueOf(month);

        return String.valueOf(month);
    }

    public static String getDay(Date birthday, boolean isZero) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(birthday);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        if (day < 10 && isZero)
            return "0" + String.valueOf(day);

        return String.valueOf(day);
    }

    /**
     * 获取当前日期的开始时间
     *
     * @return
     */
    public static Date getNowDayBegin() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return cal.getTime();
    }

    /**
     * 获取当前日期的结束时间
     *
     * @return
     */
    public static Date getNowDayEnd() {
        Calendar cal = Calendar.getInstance();

        cal.set(Calendar.HOUR, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    }

    /**
     * 获取N天前/后的开始时间
     *
     * @param day
     * @return
     */
    public static Date getDayBeginByDay(int day) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, day);
        cal.set(Calendar.HOUR, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return cal.getTime();
    }

    /**
     * 获取N天前/后的结束时间
     *
     * @param day
     * @return
     */
    public static Date getDayEndByDay(int day) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_MONTH, day);
        cal.set(Calendar.HOUR, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    }

    public static Date string2Date(String s) {
        return string2Date(s, "yyyy-MM-dd HH:mm:ss");
    }

    public static Date string2Date(String s, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        Date d = null;
        try {
            d = sdf.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return d;
    }

    /**
     * 把传入的Date转化为"yyyy-mm-dd"的字符串
     *
     * @param day
     * @return dayStr
     */
    public static String date2String(Date day) {
        return date2String(day, "yyyy-MM-dd");
    }

    public static String date2String(Date day, String pattern) {
        if (null == day) return "";
        return new SimpleDateFormat(StringUtils.isEmpty(pattern) ? "yyyy-MM-dd HH:mm:ss" : pattern).format(day);
    }

    /**
     * 根据系统当前日期和员工加入公司日期计算出该员工工作年限
     *
     * @param date
     * @return have worked years
     */
    public static int workedYears(Date date) {

        String joindate = DateUtils.date2String(date);

        if (null == joindate || "".equalsIgnoreCase(joindate)) {
            return 0;
        }

        int joinYear = Integer.parseInt(joindate.substring(0, 4));
        int joinMonth = Integer.parseInt(joindate.substring(5, 7));
        int joinDay = Integer.parseInt(joindate.substring(8, 10));

        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        if (year <= joinYear) {
            return 0;
        }

        return compareMonth(month, day, joinMonth, joinDay, year - joinYear);

    }

    public static int workedMonths(Date date) {

        String joindate = DateUtils.date2String(date);

        if (null == joindate || "".equalsIgnoreCase(joindate)) {
            return 0;
        }
        int joinMonth = Integer.parseInt(joindate.substring(5, 7));

        Calendar calendar = Calendar.getInstance();
        int month = calendar.get(Calendar.MONTH) + 1;

        if (month < joinMonth) {
            return 12 - joinMonth + month;
        } else {
            return month - joinMonth;
        }

    }

    public static int daysBetween(Date early, Date late) {

        java.util.Calendar calst = java.util.Calendar.getInstance();
        java.util.Calendar caled = java.util.Calendar.getInstance();
        calst.setTime(early);
        caled.setTime(late);
        //设置时间为0时
        calst.set(java.util.Calendar.HOUR_OF_DAY, 0);
        calst.set(java.util.Calendar.MINUTE, 0);
        calst.set(java.util.Calendar.SECOND, 0);
        caled.set(java.util.Calendar.HOUR_OF_DAY, 0);
        caled.set(java.util.Calendar.MINUTE, 0);
        caled.set(java.util.Calendar.SECOND, 0);
        //得到两个日期相差的天数 注:必须先除再减 否则会超过int类型的取值范围导致最高位符号位变成了1,经过强制转换会出现负数
        int days = ((int) (caled.getTime().getTime() / 86400000) - (int) (calst
                .getTime().getTime() / 86400000));

        return days;
    }

    /**
     * 计算今天 几号
     */
    public static int getDateNum(Date date) {
        Calendar instance = Calendar.getInstance();
        instance.setTime(date);
        return instance.get(Calendar.DATE);
    }

    /**
     * 计算当前几月份
     * @param date
     * @return
     */
    public static int getMonthNum(Date date) {
        Calendar instance = Calendar.getInstance();
        instance.setTime(date);
        return instance.get(Calendar.MONTH + 1);
    }

    public static boolean isLastDayOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));
        return calendar.get(Calendar.DAY_OF_MONTH) == 1;
    }


    public static int compareMonth(int month, int day, int joinMonth, int joinDay, int years) {

        if (month - joinMonth < 0) {
            return years - 1;
        } else if (month - joinMonth > 0) {
            return years;
        } else {
            if (day - joinDay < 0) {
                return years - 1;
            } else {
                return years;
            }
        }
    }

    public static String addZero(String date) {
        if (null == date) return "";
        if (date.length() == 1) {
            return "0" + date;
        }
        return date;
    }

    public static boolean isValidDate(String date, String pattern) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
        dateFormat.setLenient(false);

        try {
            dateFormat.parse(date.trim());
        } catch (ParseException pe) {
            return false;
        }

        return true;
    }

    public static String getTimeString(Long millisecond) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(millisecond);
        return (new SimpleDateFormat(DATE_PATTERN + " " + TIME_PATTERN)).format(calendar.getTime());
    }


    public static String convertDateToWeekString(Date aDate) {
        return aDate == null ? null : (new SimpleDateFormat(TIME_PATTERN_WEEK)).format(aDate);
    }

    public static String convertDateToString(Date aDate, String pattern) {
        return aDate == null ? null : (new SimpleDateFormat(pattern)).format(aDate);
    }

    public static String convertDateToString(Date aDate) {
        return aDate == null ? null : (new SimpleDateFormat(DATE_PATTERN)).format(aDate);
    }
    public static String convertDateToStringFromTimeZone(Date aDate, String timeZone) {
        TimeZone aDefault = TimeZone.getDefault();//原来的时区
        TimeZone time = TimeZone.getTimeZone(timeZone); //设置为东八区 timeZone :+8/-8
        TimeZone.setDefault(time);// 设置时区
        Calendar calendar = Calendar.getInstance();// 获取实例
        calendar.setTime(aDate);
        aDate = calendar.getTime(); //获取Date对象
        String s = new SimpleDateFormat(DATE_PATTERN, Locale.US).format(aDate).toLowerCase();
        TimeZone.setDefault(aDefault);// 设置会原来的时区
        return s;
    }

    public static String convertDateToAMPMString(Date aDate) {
        return aDate == null ? null : (new SimpleDateFormat(DATE_PATTERN_AM_PM, Locale.US)).format(aDate).toLowerCase();
    }

    public static String convertDateToAMPMStringFromTimeZone(Date aDate, String timeZone) {
        TimeZone aDefault = TimeZone.getDefault();//原来的时区
        TimeZone time = TimeZone.getTimeZone(timeZone); //设置为东八区 timeZone : Hongkong
        TimeZone.setDefault(time);// 设置时区
        Calendar calendar = Calendar.getInstance();// 获取实例
        calendar.setTime(aDate);
        aDate = calendar.getTime(); //获取Date对象
        String s = (new SimpleDateFormat(DATE_PATTERN_AM_PM, Locale.US)).format(aDate).toLowerCase();
        TimeZone.setDefault(aDefault);// 设置会原来的时区
        return s;
    }

    public static String convertDateToCnString(Date aDate) {
        return format(aDate, DATE_PATTERN_CN);
    }

    public static Date convertStringToDate(String strDate) {
        return parser(DATE_PATTERN, strDate);
    }

    public static Date convertString2ToDate(String strDate) {
        return parser(DATE_PATTERN2, strDate);
    }

    public static String convertDateToCompactString(Date aDate) {
        return format(aDate, COMPACT_DATE_PATTERN);
    }

    public static Date convertCompactStringToDate(String strDate) {
        return parser(COMPACT_DATE_PATTERN, strDate);
    }

    public static String convertTimeToCompactString(Date aDate) {
        return format(aDate, COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN);
    }

    public static Date convertCompactStringToTime(String strDate) {
        return parser(COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN, strDate);
    }

    public static String convertMmTimeToString(Date aTime) {
        return format(aTime, MM_TIME_PATTERN);
    }

    public static Date convertStringToMmTime(String strMmTime) {
        return parser(MM_TIME_PATTERN, strMmTime);
    }

    public static String convertDateTimeToString(Date aDateTime) {
        return format(aDateTime, DATE_PATTERN + " " + TIME_PATTERN);
    }

    public static String convertDateTimeToMilString(Date aDateTime) {
        return format(aDateTime, DATE_PATTERN + " " + MIL_PATTERN);
    }

    public static String convertDateTimeToMmString(Date aDateTime) {
        return format(aDateTime, DATE_PATTERN + " " + MM_TIME_PATTERN);
    }

    public static Date convertMmStringToDateTime(String strMmDateTime) {
        return parser(DATE_PATTERN + " " + MM_TIME_PATTERN, strMmDateTime);
    }

    public static Date convertStringToDateTime(String strDateTime) {
        return parser(DATE_PATTERN + " " + TIME_PATTERN, strDateTime);
    }


    public static String convertDateTimeToIso8601String(Date aDateTime) {
        return format(aDateTime, DATE_PATTERN + IOS8601_PATTERN);
    }

    public static Date convertIso8601StringToDateTime(String strDateTime) {
        return parser(DATE_PATTERN + IOS8601_PATTERN, strDateTime);
    }

    public static Date convertStringToDateTime(String datePattern, String strDateTime) {
        return parser(datePattern, strDateTime);
    }
    
    private static Date parser(String pattern, String dateString) {
        try {
            return new SimpleDateFormat(pattern).parse(dateString);
        } catch (ParseException e) {
            throw new ParseDateException(e);
        }
    }

    private static String format(Date date, String pattern) {
        try {
            return new SimpleDateFormat(pattern).format(date);
        } catch (Exception e) {
            throw new ParseDateException(e);
        }
    }

    /* -----------------------------  以下是日期运算方法 --------------------------- */

    public static Date getMonthEndTime(Calendar calendar) {
        Calendar tmpCalendar = (Calendar) calendar.clone();
        tmpCalendar.set(Calendar.DAY_OF_MONTH, 1);
        tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
        tmpCalendar.set(Calendar.MINUTE, 0);
        tmpCalendar.set(Calendar.SECOND, 0);
        tmpCalendar.set(Calendar.MILLISECOND, 0);

        tmpCalendar.add(Calendar.MONTH, 1);
        tmpCalendar.add(Calendar.MILLISECOND, -1);
        return tmpCalendar.getTime();
    }

    public static Date getMonthEndTime(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        return getMonthEndTime(calendar);
    }

    public static Date getMonthEndTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return getMonthEndTime(calendar);
    }

    public static Date getMonthStartTime(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        return getMonthStartTime(calendar);
    }

    public static Date getMonthStartTime(Calendar calendar) {
        Calendar tmpCalendar = (Calendar) calendar.clone();
        tmpCalendar.set(Calendar.DAY_OF_MONTH, 1);
        tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
        tmpCalendar.set(Calendar.MINUTE, 0);
        tmpCalendar.set(Calendar.SECOND, 0);
        tmpCalendar.set(Calendar.MILLISECOND, 0);
        return tmpCalendar.getTime();
    }

    public static Date getMonthStartTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return getMonthStartTime(calendar);
    }

    public static Date getDayEndTime(Calendar calendar) {
        Calendar tmpCalendar = (Calendar) calendar.clone();
        tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
        tmpCalendar.set(Calendar.MINUTE, 0);
        tmpCalendar.set(Calendar.SECOND, 0);
        tmpCalendar.set(Calendar.MILLISECOND, 0);

        tmpCalendar.add(Calendar.DATE, 1);
        tmpCalendar.add(Calendar.MILLISECOND, -1);
        return tmpCalendar.getTime();
    }

    public static Date getDayEndTime(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        calendar.set(Calendar.DAY_OF_MONTH, day);
        return getDayEndTime(calendar);
    }

    public static Date getDayEndTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return getDayEndTime(calendar);
    }

    public static Date getDayEndTime(String date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(DateUtils.convertStringToDateTime(DATE_PATTERN, date));
        return getDayEndTime(calendar);
    }

    public static Date getDayStartTime(int year, int month, int day) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month - 1);
        calendar.set(Calendar.DAY_OF_MONTH, day);
        return getDayStartTime(calendar);
    }

    public static Date getDayStartTime(Calendar calendar) {
        Calendar tmpCalendar = (Calendar) calendar.clone();
        tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
        tmpCalendar.set(Calendar.MINUTE, 0);
        tmpCalendar.set(Calendar.SECOND, 0);
        tmpCalendar.set(Calendar.MILLISECOND, 0);
        return tmpCalendar.getTime();
    }

    public static Date getDayStartTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return getDayStartTime(calendar);
    }

    public static Date getDayStartTime(String date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(DateUtils.convertStringToDateTime(DATE_PATTERN, date));
        return getDayStartTime(calendar);
    }

    public static Date getWeekStartTime(Calendar calendar) {
        Calendar tmpCalendar = (Calendar) calendar.clone();
        tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
        tmpCalendar.set(Calendar.MINUTE, 0);
        tmpCalendar.set(Calendar.SECOND, 0);
        tmpCalendar.set(Calendar.MILLISECOND, 0);
        tmpCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        tmpCalendar.set(Calendar.DAY_OF_WEEK, tmpCalendar.getFirstDayOfWeek());
        return tmpCalendar.getTime();
    }

    public static Date getWeekStartTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return getWeekStartTime(calendar);
    }

    public static Date getWeekEndTime(Calendar calendar) {
        Calendar tmpCalendar = (Calendar) calendar.clone();
        tmpCalendar.set(Calendar.HOUR_OF_DAY, 0);
        tmpCalendar.set(Calendar.MINUTE, 0);
        tmpCalendar.set(Calendar.SECOND, 0);
        tmpCalendar.set(Calendar.MILLISECOND, 0);
        tmpCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        tmpCalendar.set(Calendar.DAY_OF_WEEK, tmpCalendar.getFirstDayOfWeek());
        tmpCalendar.add(Calendar.DATE, 7);
        tmpCalendar.set(Calendar.MILLISECOND, -1);
        return tmpCalendar.getTime();
    }

    public static Date getWeekEndTime(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return getWeekEndTime(calendar);
    }

    public static Date getNextMonthDate(int nextMonthDate) {
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MONTH, 1);
        instance.set(Calendar.DATE, nextMonthDate);
        return instance.getTime();
    }

    public static Date getCurrentMonthDate(int currentMonthDate) {
        Calendar instance = Calendar.getInstance();
        instance.set(Calendar.DATE, currentMonthDate);
        return instance.getTime();
    }

    //---------------------------------------------------------

    public static Date getCurentWeekStartTime() {
        return getWeekStartTime(new Date());
    }

    public static Date getCurentWeekEndTime() {
        return getWeekEndTime(new Date());
    }

    public static Date getCurentMonthStartTime() {
        return getMonthStartTime(new Date());
    }

    public static Date getCurentMonthEndTime() {
        return getMonthEndTime(new Date());
    }

    public static int getFromYear(Date fromDate, Date toDate) {
        Calendar fromCalendar = Calendar.getInstance();
        fromCalendar.setTime(fromDate);
        Calendar now = Calendar.getInstance();
        now.setTime(toDate);
        int day = now.get(Calendar.DAY_OF_MONTH) - fromCalendar.get(Calendar.DAY_OF_MONTH);
        int month = now.get(Calendar.MONTH) - fromCalendar.get(Calendar.MONTH);
        int year = now.get(Calendar.YEAR) - fromCalendar.get(Calendar.YEAR);
        //按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
        if(day<0){
            month -= 1;
            now.add(Calendar.MONTH, -1);//得到上一个月,用来得到上个月的天数。
        }
        if(month<0){
            year--;
        }

        return year;
    }

    public static int getFromMonth(Date fromDate, Date toDate) {
        Calendar fromCalendar = Calendar.getInstance();
        fromCalendar.setTime(fromDate);
        Calendar now = Calendar.getInstance();
        now.setTime(toDate);
        int day = now.get(Calendar.DAY_OF_MONTH) - fromCalendar.get(Calendar.DAY_OF_MONTH);
        int month = now.get(Calendar.MONTH) - fromCalendar.get(Calendar.MONTH);
        //按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
        if(day<0){
            month -= 1;
            now.add(Calendar.MONTH, -1);//得到上一个月,用来得到上个月的天数。
        }
        if(month<0){
            month = (month+12)%12;
        }

        return month;
    }

    public static String getLastMonthLastDay() {
        Calendar c=Calendar.getInstance();
        c.add(Calendar.MONTH, -1);
        int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), lastMonthMaxDay);
        // date format
        String gtime = sdf.format(c.getTime()); // last Month last day
        return gtime;
    }

    public static String getLastMonthFirstDay() {
        Calendar c=Calendar.getInstance();
        c.add(Calendar.MONTH, -1);
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-01");
        String gtime2 = sdf2.format(c.getTime()); // last Month first day
        return gtime2;
    }

    public static String getCurrentMonthCurrentDay() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String currentDate = sdf.format(new Date());
        return currentDate;
    }

    public static String getCurrentMonthFirstDay() {
        Calendar c=Calendar.getInstance();
        c.add(Calendar.MONTH, 0);
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-01");
        String gtime2 = sdf2.format(c.getTime()); // current Month first day
        return gtime2;
    }

    /**
     * 计算两个日期之间相差的分钟数
     * @param startTime
     * @param endTime
     * @return
     */
    public static long dateDiffMins(Date startTime, Date endTime) {
        if (startTime == null || endTime == null || (startTime.compareTo(endTime) >= 0)) {
            return 0l;
        }
        long nd = 1000 * 24 * 60 * 60;// ms in one day
        long nh = 1000 * 60 * 60;// ms in one hour
        double nm = 1000 * 60d;// ms in one minute
        long diff;
        long day = 0;
        long hour = 0;
        long min = 0;

        diff = endTime.getTime() - startTime.getTime();
        day = diff / nd; // different days
        hour = diff % nd / nh; // different hours
        min = (long)(Math.ceil(diff % nd % nh / nm) + hour * 60 + day * 24 * 60);// different minutes

        return min;
    }

}
public class LocalDateUtils {

    public static final String DATE_PATTERN = "yyyy-MM-dd";
    public static final String DATE_PATTERN2 = "dd/MM/yyyy";
    public static final String COMPACT_DATE_PATTERN = "yyyyMMdd";
    public static final String COMPACT_TIME_PATTERN = "HHmmss";
    public static final String MM_TIME_PATTERN = "HH:mm";
    public static final String TIME_PATTERN = "HH:mm:ss";
    public static final String MIL_PATTERN = "HH:mm:ss:SSS";
    public static final String TIME_PATTERN_WEEK = "yyyy-MM-dd E";
    public static final String DATE_PATTERN_CN = "yyyy年MM月dd日";
    public static final String DATE_PATTERN_AM_PM = "h:mma 'on' dd/MM/yyyy";
    public static final String IOS8601_PATTERN = "'T'HH:mm:ss.SSS'Z'";


    public static final String ZONED_DATE_PATTERN = "'T'HH:mm:ssXXX";
    public static final String ZONED_MIL_PATTERN = "'T'HH:mm:ss.SSSXXX";
    public static final String LOCAL_DATE_PATTERN = "'T'HH:mm:ss";

    private static final int NANO_OF_SECOND = 999999999;

    private LocalDateUtils() {
    }

    private static int AGE_RANGE = 70;

    public static Instant getTodayStartUTC() {
        return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(0, 0, 0)).toInstant(ZoneOffset.UTC);
    }

    public static Instant getTodayEndUTC() {
        return LocalDateTime.of(LocalDate.now(ZoneOffset.UTC), LocalTime.of(23, 59, 59)).toInstant(ZoneOffset.UTC);
    }

    public static Instant getDayStartUTC(String dateAsText, ZoneId zoneId) {
        LocalDateTime dateTime;
        LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
        LocalTime localTime = LocalTime.of(0, 0, 0);
        dateTime = LocalDateTime.of(localDate, localTime);
        ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
        dateTime = LocalDateTime.ofInstant(zonedDateTime.toInstant(), ZoneOffset.UTC);
        return dateTime.toInstant(ZoneOffset.UTC);
    }

    public static Instant getDayEndUTC(String dateAsText, ZoneId zoneId) {
        LocalDateTime dateTime;
        LocalDate localDate = LocalDate.parse(dateAsText, DateTimeFormatter.ofPattern(DATE_PATTERN));
        LocalTime localTime = LocalTime.of(23, 59, 59);
        dateTime = LocalDateTime.of(localDate, localTime);
        ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zoneId);
        dateTime = LocalDateTime.ofInstant(zonedDateTime.toInstant(), ZoneOffset.UTC);
        return dateTime.toInstant(ZoneOffset.UTC);
    }


    public static String getTime(LocalDateTime dateTime, String format) {
        if (dateTime == null) {
            return null;
        }

        return dateTime.format(DateTimeFormatter.ofPattern(format));
    }

    /**
     * 获取当前日期的开始时间
     *
     * @return
     */
    public static LocalDateTime getNowDayBegin() {
        LocalDateTime now = LocalDateTime.now();
        return now.withHour(0).withMinute(0).withSecond(0);
    }

    /**
     * 获取当前日期的结束时间
     *
     * @return
     */
    public static LocalDateTime getNowDayEnd() {
        LocalDateTime now = LocalDateTime.now();
        return now.withHour(23).withMinute(59).withSecond(59);
    }

    /**
     * 获取N天前/后的开始时间
     *
     * @param day
     * @return
     */
    public static LocalDateTime getDayBeginByDay(int day) {
        return getNowDayBegin().minusDays(day);
    }
    /**
     * 获取N天前/后的结束时间
     *
     * @param day
     * @return
     */
    public static LocalDateTime getDayEndByDay(int day) {
        return getNowDayEnd().minusDays(day);
    }

    public static LocalDateTime string2Date(String s) {
        return stringToDate(s, "yyyy-MM-dd HH:mm:ss");
    }



    /**
     * 把传入的Date转化为"yyyy-mm-dd"的字符串
     *
     * @param day
     * @return dayStr
     */
    public static String dateToString(LocalDateTime day) {
        return dateToString(day, "yyyy-MM-dd");
    }

    public static LocalDateTime stringToDate(String s, String pattern) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
        return  LocalDateTime.parse(s,df);
    }
    public static String dateToString(LocalDateTime day, String pattern) {
        if (null == day) return "";
        return day.format(DateTimeFormatter.ofPattern(StringUtils.isEmpty(pattern) ? "yyyy-MM-dd HH:mm:ss" : pattern));
    }
    /**
     * 根据系统当前日期和员工加入公司日期计算出该员工工作年限
     *
     * @param date
     * @return have worked years
     */
    public static int workedYears(LocalDateTime date) {
        if (date == null){
            return 0;
        }

        int joinYear = date.getYear();
        int joinMonth = date.getMonthValue();
        int joinDay = date.getDayOfMonth();

        LocalDateTime now = LocalDateTime.now();
        int year = now.getYear();
        int month = now.getMonthValue();
        int day = now.getDayOfMonth();

        if (year <= joinYear) {
            return 0;
        }

        return compareMonth(month, day, joinMonth, joinDay, year - joinYear);

    }

    public static int workedMonths(LocalDateTime date) {
        if (date == null){
            return 0;
        }
        int joinMonth = date.getMonthValue();

        LocalDateTime now = LocalDateTime.now();
        int month = now.getMonthValue();

        if (month < joinMonth) {
            return 12 - joinMonth + month;
        } else {
            return month - joinMonth;
        }
    }

    public static int daysBetween(LocalDateTime early, LocalDateTime late) {
        //设置时间为0时
        LocalDate earlyDate = early.toLocalDate();
        LocalDate lateDate = late.toLocalDate();

        Long days = lateDate.toEpochDay() - earlyDate.toEpochDay();
        return days.intValue();
    }


    public static int compareMonth(int month, int day, int joinMonth, int joinDay, int years) {

        if (month - joinMonth < 0) {
            return years - 1;
        } else if (month - joinMonth > 0) {
            return years;
        } else {
            if (day - joinDay < 0) {
                return years - 1;
            } else {
                return years;
            }
        }
    }


    /* -----------------------------  日期字符串转换方法 start --------------------------- */

    public static String defaultInstantToString(Instant day) {
        return instantToString(day,DATE_PATTERN + ZONED_DATE_PATTERN);
    }
    public static String defaultZonedDateTimeToString(ZonedDateTime day){
        return zonedDateTimeToString(day, DATE_PATTERN + ZONED_DATE_PATTERN);
    }
    public static String defaultLocalDateTimeToString(LocalDateTime day){
        return localDateTimeToString(day, DATE_PATTERN + LOCAL_DATE_PATTERN);
    }
    public static String defaultLocalDateToString(LocalDate day){
        return localDateToString(day, DATE_PATTERN);
    }
    public static String defaultLocalTimeToString(LocalTime day){
        return localTimeToString(day, TIME_PATTERN);
    }


    public static String instantToString(Instant day, String pattern) {
        return null == day || StringUtils.isEmpty(pattern) ? null :zonedDateTimeToString(day.atZone(ZoneId.systemDefault()),pattern);
    }
    public static String zonedDateTimeToString(ZonedDateTime day, String pattern) {
        return null == day || StringUtils.isEmpty(pattern) ? null : day.format(DateTimeFormatter.ofPattern(pattern));
    }
    public static String localDateTimeToString(LocalDateTime day, String pattern) {
        return null == day ? null : day.format(DateTimeFormatter.ofPattern(pattern));
    }
    public static String localDateToString(LocalDate day, String pattern) {
        return null == day || StringUtils.isEmpty(pattern) ? null : day.format(DateTimeFormatter.ofPattern(pattern));
    }
    public static String localTimeToString(LocalTime day, String pattern) {
        return null == day || StringUtils.isEmpty(pattern) ? null : day.format(DateTimeFormatter.ofPattern(pattern));
    }


    public static Instant defaultStringToInstant(String s){
        return stringToInstant(s,DATE_PATTERN + ZONED_DATE_PATTERN);
    }
    public static ZonedDateTime defaultStringToZonedDateTime(String s){
        return stringToZonedDateTime(s,DATE_PATTERN + ZONED_DATE_PATTERN);
    }
    public static LocalDateTime defaultStringToLocalDateTime(String s){
        return stringToLocalDateTime(s,DATE_PATTERN + LOCAL_DATE_PATTERN);
    }
    public static LocalDate defaultStringToLocalDate(String s){
        return stringToLocalDate(s,DATE_PATTERN);
    }
    public static LocalTime defaultStringToLocalTime(String s){
        return stringToLocalTime(s,TIME_PATTERN);
    }

    public static Instant stringToInstant(String s, String pattern){
        return StringUtils.isEmpty(pattern) ? null : ZonedDateTime.parse(s,DateTimeFormatter.ofPattern(pattern)).toInstant();
    }
    public static ZonedDateTime stringToZonedDateTime(String s, String pattern){
        return StringUtils.isEmpty(pattern) ? null : ZonedDateTime.parse(s,DateTimeFormatter.ofPattern(pattern));
    }
    public static LocalDateTime stringToLocalDateTime(String s, String pattern){
        return StringUtils.isEmpty(pattern) ? null : LocalDateTime.parse(s,DateTimeFormatter.ofPattern(pattern));
    }
    public static LocalDate stringToLocalDate(String s, String pattern){
        return StringUtils.isEmpty(pattern) ? null : LocalDate.parse(s,DateTimeFormatter.ofPattern(pattern));
    }
    public static LocalTime stringToLocalTime(String s, String pattern){
        return StringUtils.isEmpty(pattern) ? null : LocalTime.parse(s,DateTimeFormatter.ofPattern(pattern));
    }


    //旧的方法 start
    public static String convertDateToWeekString(LocalDateTime aDate) {
        return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(TIME_PATTERN_WEEK));
    }

    public static String convertDateToString(LocalDateTime aDate, String pattern) {
        return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(pattern));
    }

    public static String convertDateToString(LocalDateTime aDate) {
        return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(DATE_PATTERN));
    }

    public static String convertDateToAMPMString(LocalDateTime aDate) {
        return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(DATE_PATTERN_AM_PM, Locale.US));
    }


    public static String convertDateToCnString(LocalDateTime aDate) {
        return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(DATE_PATTERN_CN));
    }

    public static LocalDate convertStringToDate(String strDate) {
        return LocalDate.parse(strDate,DateTimeFormatter.ofPattern(DATE_PATTERN));
    }

    public static LocalDateTime convertString2ToDate(String strDate) {
        return LocalDateTime.parse(strDate,DateTimeFormatter.ofPattern(DATE_PATTERN2));
    }

    public static String convertDateToCompactString(LocalDateTime aDate) {
        return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN));
    }

    public static LocalDateTime convertCompactStringToDate(String strDate) {
        return LocalDateTime.parse(strDate,DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN));
    }

    public static String convertTimeToCompactString(LocalDateTime aDate) {
        return aDate == null ? null : aDate.format(DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN));
    }

    public static LocalDateTime convertCompactStringToTime(String strDate) {
        return LocalDateTime.parse(strDate,DateTimeFormatter.ofPattern(COMPACT_DATE_PATTERN + COMPACT_TIME_PATTERN));
    }

    public static String convertMmTimeToString(LocalDateTime aTime) {
        return aTime == null ? null : aTime.format(DateTimeFormatter.ofPattern(MM_TIME_PATTERN));
    }

    public static LocalDateTime convertStringToMmTime(String strMmTime) {
        return LocalDateTime.parse(strMmTime,DateTimeFormatter.ofPattern(MM_TIME_PATTERN));
    }

    public static String convertDateTimeToString(LocalDateTime aDateTime) {
        return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern( DATE_PATTERN + " " + TIME_PATTERN));

    }

    public static String convertDateTimeToMilString(LocalDateTime aDateTime) {
        return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern(DATE_PATTERN + " " + MIL_PATTERN));
    }

    public static String convertDateTimeToMmString(LocalDateTime aDateTime) {
        return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern(DATE_PATTERN + " " + MM_TIME_PATTERN));
    }

    public static LocalDateTime convertMmStringToDateTime(String strMmDateTime) {
        return LocalDateTime.parse(strMmDateTime,DateTimeFormatter.ofPattern(DATE_PATTERN + " " + MM_TIME_PATTERN));
    }

    public static LocalDateTime convertStringToDateTime(String strDateTime) {
        return LocalDateTime.parse(strDateTime,DateTimeFormatter.ofPattern(DATE_PATTERN + " " + TIME_PATTERN));
    }


    public static String convertDateTimeToIso8601String(LocalDateTime aDateTime) {
        return aDateTime == null ? null : aDateTime.format(DateTimeFormatter.ofPattern(DATE_PATTERN + IOS8601_PATTERN));
    }

    public static LocalDateTime convertIso8601StringToDateTime(String strDateTime) {
        return LocalDateTime.parse(strDateTime,DateTimeFormatter.ofPattern(DATE_PATTERN + IOS8601_PATTERN));
    }

    public static LocalDateTime convertStringToDateTime(String datePattern, String strDateTime) {
        return LocalDateTime.parse(strDateTime,DateTimeFormatter.ofPattern(datePattern));
    }
    //旧的方法 end
    /* -----------------------------  日期字符串转换方法 end --------------------------- */


    /* -----------------------------  Object转日期类型方法 start --------------------------- */


    //判断时间类型
    public static Class getDateType(String day){
        if (day.indexOf("-") == -1){
            return LocalTime.class;
        }else if (day.length() == LocalDateUtils.DATE_PATTERN.length()){
            return LocalDate.class;
        }else {
            if (day.indexOf("Z") != -1 || day.indexOf("+") != -1 || day.lastIndexOf("-") > 7){
                return ZonedDateTime.class;
            }else {
                return LocalDateTime.class;
            }
        }
    }

    //其他时间类型转LocalDate
    public static LocalDate convertObjToLocalDate(Object day){
        Class dateType = getDateType(day.toString());
        if (dateType == LocalDate.class){
            return castToLocalDate(day);
        }else if (dateType == ZonedDateTime.class){
            return castToZonedDateTime(day).toLocalDate();
        }else if (dateType == LocalDateTime.class){
            return castToLocalDateTime(day).toLocalDate();
        }else if (dateType == Instant.class){
            return  castToInstant(day).atZone(ZoneId.systemDefault()).toLocalDate();
        }
        return null;
    }


    public static <T> T castToDate(Object obj, Class<T> clazz){
        if (clazz == LocalDate.class){
            return (T) castToLocalDate(obj);
        }else if (clazz == ZonedDateTime.class){
            return (T) castToZonedDateTime(obj);
        }else if (clazz == LocalDateTime.class){
            return (T) castToLocalDateTime(obj);
        }else if (clazz == Instant.class){
            return (T) castToInstant(obj);
        }else if (clazz == LocalTime.class){
            return (T) castToLocalTime(obj);
        }
        return null;
    }


    public static LocalDateTime castToLocalDateTime(Object day){
        if (day instanceof LocalDateTime){
            return (LocalDateTime) day;
        }else if (day instanceof String){
            return stringToLocalDateTime((String) day,DATE_PATTERN+LOCAL_DATE_PATTERN);
        }else if (day instanceof Long){
            return  LocalDateTime.ofInstant(Instant.ofEpochMilli((Long) day ), ZoneId.systemDefault());
        }
        return null;
    }

    public static LocalDate castToLocalDate(Object day){
        if (day instanceof LocalDate){
            return (LocalDate) day;
        }else if (day instanceof String){
            if (((String) day).indexOf("-") != -1){
                return stringToLocalDate((String) day,DATE_PATTERN);
            }
            return stringToLocalDate((String) day,COMPACT_DATE_PATTERN);
        }
        return null;
    }

    public static LocalTime castToLocalTime(Object day){
        if (day instanceof LocalTime){
            return (LocalTime) day;
        }else if (day instanceof String){
            return stringToLocalTime((String) day,TIME_PATTERN);
        }
        return null;
    }

    public static ZonedDateTime castToZonedDateTime(Object day){
        if (day instanceof ZonedDateTime){
            return (ZonedDateTime) day;
        }else if (day instanceof String){
            // yyyy-MM-dd'T'HH:mm:ssX  , yyyy-MM-dd'T'HH:mm:ss.SSSX
            return stringToZonedDateTime((String) day,getFormat((String) day));
        }
        return null;
    }

    public static Instant castToInstant(Object day){
        if (day instanceof Instant){
            return (Instant) day;
        }else if (day instanceof String){
            return stringToInstant((String) day,getFormat((String) day));
        }
        return null;
    }

    private static String getFormat(String s){
        if (s.indexOf(".")==-1){
            return DATE_PATTERN+ZONED_DATE_PATTERN;
        }else {
            return DATE_PATTERN+ZONED_MIL_PATTERN;
        }
    }

    /* -----------------------------  Object转日期类型方法 end --------------------------- */

    /* -----------------------------  以下是日期运算方法 --------------------------- */



    public static int getFromYear(LocalDateTime fromDate, LocalDateTime toDate) {
        int day = toDate.getDayOfMonth() - fromDate.getDayOfMonth();
        int month = toDate.getMonthValue() - fromDate.getMonthValue();
        int year = toDate.getYear() - fromDate.getYear();
        //按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
        if(day<0){
            month -= 1;
        }
        if(month<0){
            year--;
        }

        return year;
    }

    public static int getFromMonth(LocalDateTime fromDate, LocalDateTime toDate) {
        int day = toDate.getDayOfMonth() - fromDate.getDayOfMonth();
        int month = toDate.getMonthValue() - fromDate.getMonthValue();
        //按照减法原理,先day相减,不够向month借;然后month相减,不够向year借;最后year相减。
        if(day<0){
            month -= 1;
        }
        if(month<0){
            month = (month+12)%12;
        }

        return month;
    }



    public static String getLastMonthLastDay() {
        LocalDateTime now = LocalDateTime.now();
        int i = now.getMonthValue() - 1;
        if (i<=0){
            now = now.withMonth(12).withYear(now.getYear()-1);
        }else {
            now = now.withMonth(now.getMonthValue() - 1);
        }
        return now.with(TemporalAdjusters.lastDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }

    public static String getLastMonthFirstDay() {
        LocalDateTime now = LocalDateTime.now();
        int i = now.getMonthValue() - 1;
        if (i<=0){
            now = now.withMonth(12).withYear(now.getYear()-1);
        }else {
            now = now.withMonth(now.getMonthValue() - 1);
        }
        return now.format(DateTimeFormatter.ofPattern("yyyy-MM-01"));
    }

    public static String getCurrentMonthCurrentDay() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    }

    public static String getCurrentMonthFirstDay() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-01"));
    }


    public static LocalDateTime getMonthStartTime(LocalDateTime date) {
        return date.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
    }

    public static LocalDateTime getMonthEndTime(LocalDateTime date) {
        return  date.withHour(23).withMinute(59).withSecond(59).withNano(NANO_OF_SECOND).with(TemporalAdjusters.lastDayOfMonth());
    }


    public static LocalDateTime getCurentMonthStartTime() {
        return getMonthStartTime(LocalDateTime.now());
    }
    /**
     * 计算两个日期之间相差的分钟数
     * @param startTime
     * @param endTime
     * @return
     */
    public static long dateDiffMins(LocalDateTime startTime, LocalDateTime endTime) {
        if (startTime == null || endTime == null || (startTime.compareTo(endTime) >= 0)) {
            return 0l;
        }
        long nd = 1000 * 24 * 60 * 60;// ms in one day
        long nh = 1000 * 60 * 60;// ms in one hour
        double nm = 1000 * 60d;// ms in one minute
        long diff;
        long day = 0;
        long hour = 0;
        long min = 0;

        long endMilli = endTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
        long startMilli = startTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
        diff = endMilli - startMilli;
        day = diff / nd; // different days
        hour = diff % nd / nh; // different hours
        min = (long)(Math.ceil(diff % nd % nh / nm) + hour * 60 + day * 24 * 60);// different minutes

        return min;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值