Java8时间方法LocalDate和LocalDateTime工具类


/**
 * Java8时间方法LocalDate和LocalDateTime
 * getYear()    int    获取当前日期的年份
 * getMonth()    Month    获取当前日期的月份对象
 * getMonthValue()    int    获取当前日期是第几月
 * getDayOfWeek()    DayOfWeek    表示该对象表示的日期是星期几
 * getDayOfMonth()    int    表示该对象表示的日期是这个月第几天
 * getDayOfYear()    int    表示该对象表示的日期是今年第几天
 * withYear(int year)    LocalDate    修改当前对象的年份
 * withMonth(int month)    LocalDate    修改当前对象的月份
 * withDayOfMonth(int dayOfMonth)    LocalDate    修改当前对象在当月的日期
 * isLeapYear()    boolean    是否是闰年
 * lengthOfMonth()    int    这个月有多少天
 * lengthOfYear()    int    该对象表示的年份有多少天(365或者366)
 * plusYears(long yearsToAdd)    LocalDate    当前对象增加指定的年份数
 * plusMonths(long monthsToAdd)    LocalDate    当前对象增加指定的月份数
 * plusWeeks(long weeksToAdd)    LocalDate    当前对象增加指定的周数
 * plusDays(long daysToAdd)    LocalDate    当前对象增加指定的天数
 * minusYears(long yearsToSubtract)    LocalDate    当前对象减去指定的年数
 * minusMonths(long monthsToSubtract)    LocalDate    当前对象减去注定的月数
 * minusWeeks(long weeksToSubtract)    LocalDate    当前对象减去指定的周数
 * minusDays(long daysToSubtract)    LocalDate    当前对象减去指定的天数
 * compareTo(ChronoLocalDate other)    int    比较当前对象和other对象在时间上的大小,返回值如果为正,则当前对象时间较晚,
 * isBefore(ChronoLocalDate other)    boolean    比较当前对象日期是否在other对象日期之前
 * isAfter(ChronoLocalDate other)    boolean    比较当前对象日期是否在other对象日期之后
 * isEqual(ChronoLocalDate other)    boolean    比较两个日期对象是否相等
 */

/**
 * @author Chrison
 * Created at 2019/11/11
 */
public class DateUtils4Java8 {

    public static final String DATE_FORMAT_FULL = "yyyy-MM-dd HH:mm:ss";

    public static final String DATE_FORMAT_SHORT = "yyyy-MM-dd";

    public static final String DATE_FORMAT_SHORT_2 = "MM-dd HH:mm:ss";

    public static final String DATE_FORMAT_COMPACT = "yyyyMMdd";

    public static final String DATE_FORMAT_COMPACTFULL = "yyyyMMddHHmmss";

    public static final String DATE_FORMAT_FULL_MSEL = "yyyyMMddHHmmssSSSS";

    public static final String DATE_YEAR_MONTH = "yyyyMM";

    public static final String DATE_FORMAT_FULL_MSE = "yyyyMMddHHmmssSSS";



    /**
     * 获取系统当前日期
     *
     * @return
     */
    public static Date getCurrentDate() {
        return new Date();
    }

    /**
     * 获取系统当前日期
     *
     * @return
     */
    public static LocalDateTime getCurrentLocalDateTime() {
        return LocalDateTime.now();
    }

    /**
     * 根据时间格式返回对应的String类型的时间
     *
     * @param format
     * @return
     */
    public static String getCurDateTime(String format) {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        String dataTime = now.format(dateTimeFormatter);
        return dataTime;
    }

    /**
     * 得到当前日期
     *
     * @return String 当前日期 yyyy-MM-dd HH:mm:ss格式
     * @author kevin
     */
    public static String getCurDateTimeFull() {
        return getCurDateTime(DATE_FORMAT_FULL);
    }

    /**
     * 得到当前日期
     *
     * @return String 当前日期 yyyy-MM-dd HH:mm:ss格式
     * @author kevin
     */
    public static String getCurDateTimeShort2() {
        return getCurDateTime(DATE_FORMAT_SHORT_2);
    }


    /**
     * 得到当前日期
     *
     * @return String 当前日期 yyyyMMddHHmmss格式
     * @author kevin
     */
    public static String getCurDateTime1() {
        return getCurDateTime(DATE_FORMAT_FULL);
    }

    /**
     * 得到当前日期YYYYMM格式
     *
     * @return String 当前日期 yyyyMM格式
     * @author kevin
     */
    public static String getCurDateYYYYMM() {
        return getCurDateTime(DATE_YEAR_MONTH);
    }


    /**
     * 得到当前日期
     *
     * @return String 当前日期 yyyyMMdd格式
     * @author kevin
     */
    public static String getCurDateYYYYMMDD() {
        return getCurDateTime(DATE_FORMAT_COMPACT);
    }

    /**
     * 判断是否是今天
     *
     * @param strDate
     * @return
     */
    public static boolean isCurrentDay(String strDate) {
        boolean bRet = false;
        LocalDate strLocalDate = LocalDate.parse(strDate);
        if (LocalDate.now().getYear() == strLocalDate.getYear()) {
            MonthDay monthDay = MonthDay.from(strLocalDate);
            MonthDay today = MonthDay.from(LocalDate.now());
            return monthDay.equals(today);
        }
        return bRet;
    }

    /**
     * 获取几小时后的时间
     *
     * @param hour
     * @param format
     * @return
     */
    public static String getAfterDateTime(int hour, String format) {
        LocalTime localTime = LocalTime.now().plusHours(hour);
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        String dataTime = localTime.format(dateTimeFormatter);
        return dataTime;
    }


    /**
     * 当前日期时间戳(yyyyMMddHHmmssSSSS)
     *
     * @return
     * @author liangxuekai
     */
    public static String getTimeStamp() {
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_FORMAT_FULL_MSEL);
        return now.format(dateTimeFormatter);
    }

    /**
     * 日期转字符串
     *
     * @return String
     * @author kevin
     */
    public static String parseDateToString(Date thedate, String format) {
        if (thedate != null) {
            Instant instant = thedate.toInstant();
            ZoneId zone = ZoneId.systemDefault();
            LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
            return localDateTime.format(dateTimeFormatter);
        }
        return null;
    }

    /**
     * 日期转字符串
     *
     * @return String
     * @author kevin
     */
    public static String parseDateToString(Date thedate, String format, String zoneId) {
        if (thedate != null) {
            Instant instant = thedate.toInstant();
            ZoneId zone = ZoneOffset.of(zoneId);
            LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
            return localDateTime.format(dateTimeFormatter);
        }
        return null;
    }

    /**
     * parseDateToString(Date thedate, String format)的重载方法
     *
     * @param thedate
     * @return
     */
    public static String parseDateToString(Date thedate) {
        // String format = "yyyy-MM-dd";
        return parseDateToString(thedate, DATE_FORMAT_FULL);
    }

    /**
     * parseDateToString(Date thedate, String format)的重载方法
     *
     * @param thedate
     * @return
     */
    public static String parseDateToStringByZoneId(Date thedate, String zoneId) {
        // String format = "yyyy-MM-dd";
        return parseDateToString(thedate, DATE_FORMAT_FULL,zoneId);
    }

    /**
     * 字符串转日期
     *
     * @return Date
     * @author kevin
     */
    public static Date parseStringToDate(String thedate, String format) {
        DateFormat sdf = new SimpleDateFormat(format);
        Date dd1 = null;
        try {
            dd1 = sdf.parse(thedate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dd1;
    }

    /**
     * 由String型日期转成format形式String
     *
     * @param format1 原先格式
     * @param format2 转化格式
     * @return String
     * @author kevin
     */
    public static String changeFormatDateString(String format1, String format2, String strDate) {
        if (strDate == null) {
            return "";
        }
        if (strDate.length() >= format1.length() && format1.length() >= format2.length()) {
            return parseDateToString(parseStringToDate(strDate, format1), format2);
        }
        return strDate;
    }

    /**
     * 得到当前日期的前N天时间 yyyymmdd
     *
     * @param format
     * @param day
     * @return
     */
    public static String beforeNDaysDate(String format, int day) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        if (day > 0) {
            return LocalDateTime.now().minusDays(day).format(dateTimeFormatter);
        }
        return null;
    }

    /**
     * 获得N个月后的日期
     * <p>
     * theDate 日期
     * <p>
     * int month 月数
     * <p>
     * format 格式
     */
    public static String afterNMonthDate(String theDate, int month, String format) {

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(theDate,dateTimeFormatter)
                .plusMonths(month)
                .format(dateTimeFormatter);

    }

    /**
     * 得到N天后的日期
     *
     * @param theDate 某日期
     *                格式 yyyy-MM-dd
     * @param nDayNum N天
     * @return String N天后的日期
     * @author kevin
     */
    public static String afterNDaysDate(String theDate, Integer nDayNum, String format) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);

        return LocalDateTime.parse(theDate,dateTimeFormatter)
                .plusDays(nDayNum)
                .format(dateTimeFormatter);
    }

    /**
     * 得到N小时后的日期
     *
     * @param theDate  时间
     * @param nHourNum N小时数
     * @param format   时间格式
     * @return
     */
    public static String afterNHoursDate(String theDate, Integer nHourNum, String format) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(theDate,dateTimeFormatter)
                .plusHours(nHourNum)
                .format(dateTimeFormatter);
    }

    /**
     * 得到N分钟后的日期
     *
     * @param theDate
     * @param nMinNum
     * @param format
     * @return
     */
    public static String afterNMinsDate(String theDate, Integer nMinNum, String format) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(theDate,dateTimeFormatter)
                .plusMinutes(nMinNum)
                .format(dateTimeFormatter);
    }

    /**
     * 得到N秒后的日期
     * @param theDate
     * @param nSecNum
     * @param format
     * @return
     */
    public static String afterNSecondsDate(String theDate, Integer nSecNum, String format) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(theDate,dateTimeFormatter)
                .plusSeconds(nSecNum)
                .format(dateTimeFormatter);
    }

    // 比较两个字符串格式日期大小,带格式的日期
    public static boolean isBefore(String strdat1, String strdat2, String format) {
        try {
            Date dat1 = parseStringToDate(strdat1, format);
            Date dat2 = parseStringToDate(strdat2, format);
            return dat1.before(dat2);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 比较两个字符串格式日期大小,带格式的日期,返回int
    public static long isBefore_int(String strdat1, String strdat2, String format) {
        long result = 0;
        try {
            Date dat1 = parseStringToDate(strdat1, format);
            Date dat2 = parseStringToDate(strdat2, format);
            return dat2.getTime() - dat1.getTime();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


    /*
     * 得到上一个月或者下一个月的日期
     */
    public static String getDayafterMonth(String theDate, int month, String formatStr) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(formatStr);
        return LocalDateTime.parse(theDate).plusMonths(month).format(dateTimeFormatter);
       /* Calendar now = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
        Date dat1 = parseStringToDate(theDate, formatStr);
        now.setTime(dat1);
        sdf.setTimeZone(TimeZone.getDefault());
        now.add(Calendar.MONTH, month);
        return sdf.format(now.getTime());*/
    }

    /**
     * 将秒转换为小时分秒等
     *
     * @param sec
     * @return
     */
    public String changeTime(int sec) {
        String temp = "";
        if (sec < 60) {
            temp = "" + sec + "秒";
        } else if (sec < 3600) {
            temp = "" + sec / 60 + "分" + sec % 60 + "秒";
        } else {
            temp = "" + sec / 3600 + "小时" + (sec % 3600) / 60 + "分" + sec % 60 + "秒";
        }
        return temp;
    }

    /**
     * 方法描述:
     * 计算两个日期相差天数
     *
     * @param end   结束日期
     * @param start 开始日期
     * @return 作者:liangxuekai
     * 日期:2018 2018年1月31日
     */
    public static int getSubDays(String end, String start) {
        LocalDate startDate = LocalDate.parse(start);
        LocalDate endDate = LocalDate.parse(end);
        Long between = ChronoUnit.DAYS.between(startDate, endDate);
        return between.intValue();
    }

    /**
     * 方法描述:
     * 计算两个日期相差天数2
     *
     * @param endDate   结束日期
     * @param startDate 开始日期
     * @return 作者:liangxuekai
     * 日期:2018 2018年1月31日
     */
    public static int getSubDays(LocalDate endDate, LocalDate startDate) {
        Long between = ChronoUnit.DAYS.between(startDate, endDate);
        return between.intValue();
    }


    public static String getTimeDiff(Date time1, Date time2) throws Exception {
        long l = time1.getTime() - time2.getTime();
        String returnStr = "";
        long day = l / (24 * 60 * 60 * 1000);
        if (day > 0) {
            returnStr += (day + "天");
        }
        long hour = (l / (60 * 60 * 1000) - day * 24);
        if (hour > 0) {
            returnStr += (hour + "小时");
        }
        long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60);
        if (min > 0) {
            returnStr += (min + "分");
        }
        long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        if (s > 0) {
            returnStr += (s + "秒");
        }
        return returnStr;
    }


    /**
     * 格式化时间-默认yyyy-MM-dd HH:mm:ss格式
     *
     * @param dateTime LocalDateTime对象
     * @param pattern  要格式化的字符串
     * @return
     */
    public static String formatDateTime(LocalDateTime dateTime, String pattern) {
        if (dateTime == null) {
            return null;
        }
        return dateTime.format(DateTimeFormatter.ofPattern(StringUtils.isEmpty(pattern) ? DATE_FORMAT_FULL : pattern));
    }

    public static String formatDateTime(LocalDateTime dateTime) {
        return formatDateTime(dateTime, DATE_FORMAT_FULL);
    }


    /**
     * 获取某天的00:00:00
     *
     * @param dateTime
     * @return
     */
    public static String getDayStart(LocalDateTime dateTime) {
        return formatDateTime(dateTime.with(LocalTime.MIN));
    }

    public static String getDayStart() {
        return getDayStart(LocalDateTime.now());
    }

    /**
     * 获取某天的23:59:59
     *
     * @param dateTime
     * @return
     */
    public static String getDayEnd(LocalDateTime dateTime) {
        return formatDateTime(dateTime.with(LocalTime.MAX));
    }

    public static String getDayEnd() {
        return getDayEnd(LocalDateTime.now());
    }

    /**
     * 获取某月第一天的00:00:00
     *
     * @param dateTime LocalDateTime对象
     * @return
     */
    public static String getFirstDayOfMonth(LocalDateTime dateTime) {
        return formatDateTime(dateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN));
    }

    public static String getFirstDayOfMonth() {
        return getFirstDayOfMonth(LocalDateTime.now());
    }

    /**
     * 获取某月最后一天的23:59:59
     *
     * @param dateTime LocalDateTime对象
     * @return
     */
    public static String getLastDayOfMonth(LocalDateTime dateTime) {
        return formatDateTime(dateTime.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX));
    }

    public static String getLastDayOfMonth() {
        return getLastDayOfMonth(LocalDateTime.now());
    }


    /**
     * 获取某年第一天的00:00:00
     *
     * @param dateTime LocalDateTime对象
     * @return
     */
    public static String getFirstDayOfYear(LocalDateTime dateTime) {
        return formatDateTime(dateTime.with(TemporalAdjusters.firstDayOfYear()).with(LocalTime.MIN));
    }

    public static String getFirstDayOfYear() {
        return getFirstDayOfYear(LocalDateTime.now());
    }

    /**
     * 获取某年最后一天的23:59:59
     *
     * @param dateTime LocalDateTime对象
     * @return
     */
    public static String getLastDayOfYear(LocalDateTime dateTime) {
        return formatDateTime(dateTime.with(TemporalAdjusters.lastDayOfYear()).with(LocalTime.MAX));
    }

    public static String getLastDayOfYear() {
        return getLastDayOfYear(LocalDateTime.now());
    }

    /**
     * Date转LocalDate
     * @param date
     */
    public static LocalDate date2LocalDate(Date date) {
        if(null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * Date转LocalDateTime
     * @param date
     */
    public static LocalDateTime date2LocalDateTime(Date date) {
        if(null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * LocalDate转Date
     * @param localDate
     * @return
     */
    public static Date localDate2Date(LocalDate localDate) {
        if(null == localDate) {
            return null;
        }
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

    /**
     * LocalDateTime转Date
     * @param localDateTime
     * @return
     */
    public static Date localDateTime2Date(LocalDateTime localDateTime) {
        if(null == localDateTime) {
            return null;
        }
        ZonedDateTime zonedDateTime = localDateTime.toLocalDate().atStartOfDay(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

    public static String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";

    public static String SEQUENCE_FORMAT = "yyyyMMddHHmmss";

    public static String DEFAULT_DATE = "yyyy-MM-dd";

    public static String VN_DATE = "dd/MM/yyyy";

    public static String formatNowWithDefaultFormat() {
        return formatNow(DEFAULT_FORMAT);
    }

    /**
     * @param pattern
     * @return e.g. 2018-08-22 22:55:17
     */
    public static String formatNow(String pattern) {
        LocalDateTime now = LocalDateTime.now();

        return format(now, pattern);
    }

    /**
     * format a date time to the given pattern
     *
     * @param dateTime
     * @param pattern
     * @return e.g. 2018-08-22 22:55:17
     */
    public static String format(LocalDateTime dateTime, String pattern) {
        if (org.springframework.util.StringUtils.isEmpty(pattern)) {
            pattern = DEFAULT_FORMAT;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return dateTime.format(formatter);
    }

    public static String formatDate(LocalDate date, String pattern) {
        if (org.springframework.util.StringUtils.isEmpty(pattern)) {
            pattern = DEFAULT_DATE;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return date.format(formatter);
    }


    public static LocalDateTime parse(String strDateTime) {
        return parse(strDateTime, DEFAULT_FORMAT);
    }

    /**
     * parse a formatted date time string to LocalDateTime
     *
     * @param strDateTime
     * @param pattern
     * @return
     */
    public static LocalDateTime parse(String strDateTime, String pattern) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return LocalDateTime.parse(strDateTime, formatter);

    }

    /**
     * a formatted ISO 8601 date time string to LocalDateTime
     *
     * @param strDateTime
     * @return
     */
    public static LocalDateTime parseISODateTime(String strDateTime) {
        if (org.springframework.util.StringUtils.isEmpty(strDateTime)) {
            return null;
        }
        DateTimeFormatter ISO_OFFSET_DATE_TIME_X = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
                .optionalStart().appendOffset("+HH", "Z").optionalEnd()
                .toFormatter();
        return LocalDateTime.parse(strDateTime, ISO_OFFSET_DATE_TIME_X);
    }

    /**
     * parse a formatted date time string to LocalDate
     *
     * @param strDate
     * @return
     */
    public static LocalDate parseToDate(String strDate) {
        int dateLength = DEFAULT_DATE.length();
        if (org.springframework.util.StringUtils.isEmpty(strDate) || strDate.length() < dateLength) {
            return null;
        }
        String dateStr = strDate.substring(0, dateLength);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE);
        return LocalDate.parse(dateStr, formatter);
    }

    public static LocalDate parseToDateFuzzy(String year, String month, String day) {
        if (org.springframework.util.StringUtils.isEmpty(year)) {
            return null;
        }
        if (org.springframework.util.StringUtils.isEmpty(month)) {
            month = "01";
        }
        if (month.length() == 1) {
            month = "0" + month;
        }
        if (org.springframework.util.StringUtils.isEmpty(day)) {
            day = "01";
        }
        if (day.length() == 1) {
            day = "0" + day;
        }
        return parseToDate(year + "-" + month + "-" + day);
    }

    public static LocalDate parseAdvanceAIBirthDay(String birthDayStr, String separator) {
        if (org.springframework.util.StringUtils.isEmpty(birthDayStr)) {
            return null;
        }
        if (!birthDayStr.contains(separator)) {
            return parseToDateFuzzy(birthDayStr, "", "");
        } else if (birthDayStr.indexOf(separator) == birthDayStr.lastIndexOf(separator)) {
            return parseToDateFuzzy(birthDayStr.split(separator)[1], birthDayStr.split(separator)[0], "");
        } else {
            return parseToDateFuzzy(birthDayStr.split(separator)[2], birthDayStr.split(separator)[1], birthDayStr.split(separator)[0]);
        }
    }

    /**
     * parse a formatted date time string to LocalDate
     *
     * @param strDate
     * @return
     */
    public static LocalDate parseToDate(String strDate, String pattern) {
        int dateLength = pattern.length();
        if (org.springframework.util.StringUtils.isEmpty(strDate) || strDate.length() < dateLength) {
            return null;
        }
        String dateStr = strDate.substring(0, dateLength);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        return LocalDate.parse(dateStr, formatter);
    }

    /**
     * @param localDateTime
     * @return 2018-08-22 22:55:17 -> 2018-08-22 00:00:00
     */
    public static LocalDateTime beginOfDay(LocalDateTime localDateTime) {
        return LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.of(0, 0, 0));
    }

    /**
     * @param localDateTime
     * @return 2018-10-23 19:00:00 -> 2018-10-23 23:59:59
     */
    public static LocalDateTime endOfDay(LocalDateTime localDateTime) {
        return LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.of(23, 59, 59));
    }

    /**
     * @param localDateTime
     * @return 2018-10-23 19:00:00 -> 2018-10-24 00:00:00
     */
    public static LocalDateTime beginOfTomorrow(LocalDateTime localDateTime) {
        return LocalDateTime.of(localDateTime.plusDays(1).toLocalDate(), LocalTime.of(0, 0, 0));
    }

    /**
     * @param localDateTime
     * @return 2018-10-23 19:00:00 -> 2018-10-22 00:00:00
     */
    public static LocalDateTime beginOfYesterday(LocalDateTime localDateTime) {
        return LocalDateTime.of(localDateTime.minusDays(1).toLocalDate(), LocalTime.of(0, 0, 0));
    }

    /**
     * @param localDateTime
     * @return 2018-10-23 19:00:00 -> 2018-10-22 23:59:59
     */
    public static LocalDateTime endOfYesterday(LocalDateTime localDateTime) {
        return LocalDateTime.of(localDateTime.minusDays(1).toLocalDate(), LocalTime.of(23, 59, 59));
    }

    public static LocalDateTime timestampToLocalDateTime(long timestamp) {
        LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.of("+08"));
        return localDateTime;
    }

    public static int getDayInterval(LocalDateTime start, LocalDateTime end) {
        LocalDate startDate = start.toLocalDate();
        LocalDate endDate = end.toLocalDate();
        return (int) ChronoUnit.DAYS.between(startDate, endDate);
    }

    public static int getDayInterval(LocalDate start, LocalDate end) {
        return (int) ChronoUnit.DAYS.between(start, end);
    }

    public static Boolean checkIdCardExpiry(LocalDate expiryDate) {
        return getDayInterval(LocalDate.now(),expiryDate)<0;
    }

    public static long getAgeFromBirthday(LocalDate birthday) {
        return getAgeFromBirthday(birthday, LocalDate.now());
    }

    public static long getAgeFromBirthday(LocalDate birthday, LocalDate toDate) {
        return ChronoUnit.YEARS.between(birthday, toDate);
    }

    public static long getCurrentUnixTimestampForChina() {
        return getCurrentUnixTimestamp(8);
    }

    public static long getCurrentUnixTimestampForVn() {
        return getCurrentUnixTimestamp(7);
    }

    public static long getCurrentUnixTimestamp(int zoneOffsetHours) {
        return LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(zoneOffsetHours));
    }

    public static String changeTZ(String tzFrom, String tzTo, String dateToChange, String pattern) {
        ZoneId zoneFrom = ZoneId.of(tzFrom);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
        LocalDateTime localtDateAndTime = LocalDateTime.parse(dateToChange, formatter);
        ZonedDateTime dateAndTimeINeed = ZonedDateTime.of(localtDateAndTime, zoneFrom );

        ZonedDateTime rezDate = dateAndTimeINeed.withZoneSameInstant(ZoneId.of(tzTo));

        return formatter.format(rezDate);
    }

    public static String convertUsTime1(Date date){
        return changeTZ("Asia/Shanghai","America/New_York", DateUtils4Java8.parseDateToString(date),"yyyy-MM-dd HH:mm:ss");
    }

    public static Date convertUsTime2(Date date){
        return DateUtils.parseDate(changeTZ("Asia/Shanghai","America/New_York", DateUtils4Java8.parseDateToString(date),"yyyy-MM-dd HH:mm:ss"));
    }

    public static void main(String[] args) {
        System.out.println(changeTZ("Asia/Shanghai","America/New_York","2021-01-19T02:52:08.302+0000","yyyy-MM-dd'T'HH:mm:ss.SSS'+'0000"));

    }
}

声明:目的地-Destination|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Java8时间方法LocalDate和LocalDateTime工具类


前程似锦、未来可期、寻得良人、共赴白头,祝你也祝我。