时间工具类、Instant、date、LocalDate、String、LocalDateTime 相互转换

public final class TimeUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(TimeUtil.class);

    private TimeUtil() {
    }

    /**
     * 获取当前时间(系统时间)距离特定时间(如18:00:00)的间隔,结果可能为正,亦可为负
     * 间隔 >=0: 表示当前时间未到达(或刚好到达)设定的时间
     * 间隔 <0: 表示当前时间已超过设定的时间
     * 有异常时抛出
     *
     * @param time 字符串形式的时间,如 09:00:00 (不能写作 9:00:00)
     * @return long
     */
    public static long getTimeDiffWithMills(String time) {
        try {
            // HH:mm:ss
            DateTimeFormatter localTimeFormatter = DateTimeFormatter.ofPattern(ConstantUtil.DATE_TIME_FORMAT_GENERAL_INFO);
            LocalTime planTime = LocalTime.parse(time, localTimeFormatter);
            LocalTime now = LocalTime.now();
            return Duration.between(now, planTime).toMillis();
        } catch (Exception e) {
            LOGGER.error("error message: 获取当前时间(系统时间)距离特定时间 <{}> 的间隔异常,原因是 <{}>", time, String.valueOf(e));
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    /**
     * 依据设定时间及其任务执行类型获取调整后的监听时间
     *
     * @param time            String    字符串形式的时间,如 09:00:00 (不能写作 9:00:00)
     * @param taskExecuteType AnalysisEnumEntity.TaskExecuteType    任务执行类型
     * @return long 调整后的毫秒时间
     */
    public static long getAdjustedTimeDiffWithMillsByType(String time, AnalysisEnumEntity.TaskExecuteType taskExecuteType) {
        try {
            long initialDiff = getTimeDiffWithMills(time);
            switch (taskExecuteType) {
                // 定时执行
                case TASK_EXECUTE_TYPE_TIMED:
                    if (initialDiff >= 0) {
                        return initialDiff;
                    } else {
                        return initialDiff + ConstantUtil.ONE_DAY_IN_MILLISECONDS;
                    }
                    // 立即执行
                case TASK_EXECUTE_TYPE_IMMEDIATELY:
                    return 0;
                default:
                    LOGGER.error("error message: 暂不支持的任务执行类型 <{}>", taskExecuteType.getLabel());
                    return 0;
            }
        } catch (Exception e) {
            LOGGER.error("error message: 依据任务类型 <{}> 获取调整后毫秒时间异常,原因是 <{}>", taskExecuteType.getLabel(), String.valueOf(e));
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    public static long getTime(String time) {
        DateFormat dateFormat = new SimpleDateFormat(ConstantUtil.DATE_TIME_FORMAT_GENERAL_YEAR);
        try {
            Date curDate = dateFormat.parse(time);
            return curDate.getTime() - System.currentTimeMillis();
        } catch (ParseException e) {
            LOGGER.error("error message: 时间转换出错,原因是 <{}>", String.valueOf(e));
            return 0;
        }
    }

    /**
     * 将 Instant 时间转换为 Date
     *
     * @param instant Instant
     * @return Date
     * @throws BusinessException 转换异常
     */
    public static Date instantToDate(Instant instant) throws BusinessException {
        try {
            return new Date(instant.toEpochMilli());
        } catch (Exception e) {
            LOGGER.error("error message: Instant 时间转换为 Date,失败,原因", e);
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    public static long getAdjustedTime(String time, AnalysisEnumEntity.TaskExecuteType taskExecuteType) {
        long initialDiff = getTime(time);
        switch (taskExecuteType) {
            // 定时执行
            case TASK_EXECUTE_TYPE_TIMED:
                if (initialDiff >= 0) {
                    return initialDiff;
                } else {
                    return initialDiff + ConstantUtil.ONE_DAY_IN_MILLISECONDS;
                }
                // 立即执行
            case TASK_EXECUTE_TYPE_IMMEDIATELY:
                return 0;
            default:
                return 0;
        }
    }

    /**
     * 将 unix 时间戳转换为 相应时区时间
     * 注意:当发生异常时,返回空字符串,未抛出异常
     *
     * @param instant    Instant    Instant 时间
     * @param zoneIdType SystemEnumEntity.ZoneIdType    自定义时区类型
     * @return String
     */
    public static String instantToString(Instant instant, SystemEnumEntity.ZoneIdType zoneIdType) {
        if (null == instant || null == zoneIdType) {
            LOGGER.debug("debug message: Instant 时间 <{}> 或 时区信息 <{}> 无效", instant, zoneIdType);
            return ConstantUtil.SPECIAL_CHARACTER_EMPTY;
        }
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(ConstantUtil.DATE_TIME_FORMAT_GENERAL)
                    .withZone(ZoneId.of(zoneIdType.getLabel()));
            return dateTimeFormatter.format(instant);
        } catch (Exception e) {
            LOGGER.error("error message: Instant 时间 <{}> 转换为特定字符串格式时间异常,原因是 <{}>", instant, String.valueOf(e));
            return ConstantUtil.SPECIAL_CHARACTER_EMPTY;
        }
    }

    /**
     * 将日期格式形如 yyyy-MM-dd HH:mm:ss 的字符串转为 Instant格式形如yyyy-MM-ddTHH:mm:ssZ 的字符串
     *
     * @param dateTime String 日期格式形如 yyyy-MM-dd HH:mm:ss 的字符串
     * @return Instant格式形如yyyy-MM-ddTHH:mm:ssZ 的字符串
     * @throws BusinessException 日期转换异常
     */
    public static String dateStringToInstantString(String dateTime) throws BusinessException {
        try {
            dateTime = dateTime.toUpperCase();
            if (dateTime.contains("T") && dateTime.contains("Z")) {
                return dateTime;
            }
            Instant instant = TimeUtil.stringToInstant(dateTime, SystemEnumEntity.ZoneIdType.ZONE_ID_TYPE_UTC, false);
            return instant.toString();
        } catch (Exception e) {
            LOGGER.error("error message: 日期时间 <{}> 转换为 Instant 时间异常,原因是 <{}>", dateTime, String.valueOf(e));
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    /**
     * 将 String 时间转换为 相应时区下的时间戳
     *
     * @param dateTime           String
     * @param zoneIdType         SystemEnumEntity.ZoneIdType
     * @param dateTimeFormatFlag boolean
     *                           True-Instant格式的字符串,形如"2021-11-25T14:00:13Z"
     *                           False-非Instant格式的字符串,形如"2021-11-25 14:00:13"
     * @return Instant
     * @throws BusinessException 抛出异常
     */
    public static Instant stringToInstant(String dateTime,
                                          SystemEnumEntity.ZoneIdType zoneIdType,
                                          boolean dateTimeFormatFlag) throws BusinessException {
        if (StringUtil.isEmpty(dateTime) || null == zoneIdType) {
            LOGGER.error("error message: 日期时间 <{}> 或 时区信息 <{}> 无效", dateTime, zoneIdType);
            throw new BusinessException(GuiErrorCode.ACCESS_PARAMETER_INVALID);
        }
        try {
            if (dateTimeFormatFlag) {
                return LocalDateTime.ofInstant(Instant.parse(dateTime), ZoneId.of(zoneIdType.getLabel())).toInstant(ZoneOffset.UTC);
            } else {
                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(ConstantUtil.DATE_TIME_FORMAT_GENERAL);
                LocalDateTime localDateTime = LocalDateTime.parse(dateTime, dateTimeFormatter);
                return localDateTime.atZone(ZoneId.of(zoneIdType.getLabel())).toInstant();
            }
        } catch (Exception e) {
            LOGGER.error("error message: 字符串格式时间 <{}> 转换为 Instant 异常,原因是 <{}>", dateTime, String.valueOf(e));
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    /**
     * 将 Instant 时间转换为 LocalDateTime
     *
     * @param instant    Instant   Instant 时间
     * @param zoneIdType SystemEnumEntity.ZoneIdType 时区信息
     * @return LocalDateTime
     * @throws BusinessException 转换异常
     */
    public static LocalDateTime instantToLocalDateTime(Instant instant, SystemEnumEntity.ZoneIdType zoneIdType) throws BusinessException {
        try {
            return LocalDateTime.ofInstant(instant, ZoneId.of(zoneIdType.getLabel()));
        } catch (Exception e) {
            LOGGER.error("error message: Instant 时间 <{}> 转换为 LocalDateTime 异常,原因是 <{}>", instant, String.valueOf(e));
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    /**
     * 将日期转为特定格式的字符串日期
     *
     * @param date       Date 待转换的日期
     * @param format     String 时间格式字符串
     * @param zoneIdType SystemEnumEntity.ZoneIdType 时区信息
     * @return String 字符串格式的时间
     * @throws BusinessException 自定义异常
     */
    public static String dateToString(Date date, String format, SystemEnumEntity.ZoneIdType zoneIdType) throws BusinessException {
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
            return dateTimeFormatter.format(date.toInstant().atZone(ZoneId.of(zoneIdType.getLabel())).toLocalDate());
        } catch (Exception e) {
            LOGGER.error("error message: 日期 <{}> 转换为 String 格式 <{}> 日期时间异常,原因是 <{}>", date, format, String.valueOf(e));
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    /**
     * 将特定格式的字符串日期转为日期形式
     *
     * @param str        Date
     * @param dateFormat String
     * @return String
     * @throws BusinessException 自定义异常
     */
    public static LocalDate stringToLocalDate(String str, String dateFormat) throws BusinessException {
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat);
            return LocalDate.parse(str, dateTimeFormatter);
        } catch (Exception e) {
            LOGGER.error("error message: String 格式日期 <{}> 转换为 LocalDate 格式 <{}> 日期时间异常,原因是 <{}>", str, dateFormat, String.valueOf(e));
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    /**
     * 获取当前日期的特定格式
     *
     * @param timeFormat String 日期格式
     * @return String
     * @throws BusinessException 异常
     */
    public static String getCurrentDate(String timeFormat) throws BusinessException {
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(timeFormat);
            return dateTimeFormatter.format(LocalDateTime.now());
        } catch (Exception e) {
            LOGGER.error("error message: 获取当前日期的特定格式,数据异常,原因:<{}>", String.valueOf(e));
            throw new BusinessException((SystemErrorCode.DATE_CONVERT_FAILED));
        }
    }

    /**
     * 获取当前日期前的若干天的特定格式
     *
     * @param beforeDays int 天数
     * @param timeFormat String 日期格式
     * @return String
     * @throws BusinessException 异常
     */
    public static String getCurrentDateBeforeSpecialDays(int beforeDays, String timeFormat) throws BusinessException {
        try {
            // 获取基于当前日期之前的特定日期
            LocalDate currentDate = LocalDate.now().minusDays(beforeDays);
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(timeFormat);
            return dateTimeFormatter.format(currentDate);
        } catch (Exception e) {
            LOGGER.error("error message: 获取当前日期前的若干天的特定格式,数据异常,原因:<{}>", String.valueOf(e));
            throw new BusinessException((SystemErrorCode.DATE_CONVERT_FAILED));
        }
    }

    /**
     * 依据指标同步频率获取任务开始日期
     *
     * @param actualIndexFrequency AnalysisEnumEntity.IndexFrequency 指标同步频率
     * @return String
     */
    public static String getTaskStartDate(AnalysisEnumEntity.IndexFrequency actualIndexFrequency) {
        String date;
        switch (actualIndexFrequency) {
            case INDEX_FREQUENCY_WEEK:
                date = getCurrentDateBeforeSpecialDays(
                        7,
                        ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
            case INDEX_FREQUENCY_TEN_DAYS:
                date = getCurrentDateBeforeSpecialDays(
                        10,
                        ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
            case INDEX_FREQUENCY_MONTH:
                date = getCurrentDateBeforeSpecialDays(
                        30,
                        ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
            case INDEX_FREQUENCY_QUARTER:
                date = getCurrentDateBeforeSpecialDays(
                        90,
                        ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
            case INDEX_FREQUENCY_HALF_YEAR:
                date = getCurrentDateBeforeSpecialDays(
                        180,
                        ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
            case INDEX_FREQUENCY_YEAR:
                date = getCurrentDateBeforeSpecialDays(
                        360,
                        ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
            case INDEX_FREQUENCY_HALF_MONTH:
                date = getCurrentDateBeforeSpecialDays(
                        15,
                        ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
            // 其它情况默认为每日
            default:
                date = getCurrentDate(ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
                break;
        }
        return date;
    }

    /**
     * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
     *
     * @param dateDate Date
     * @return String
     */
    public static String dateToStrLong(Date dateDate) {
        SimpleDateFormat formatter = new SimpleDateFormat(ConstantUtil.DATE_TIME_FORMAT_GENERAL_INFO);
        return formatter.format(dateDate);
    }

    /**
     * 将短时间格式时间转换为字符串 yyyy-MM-dd
     *
     * @param dateDate Date
     * @return String
     */
    public static String dateToStr(Date dateDate) {
        SimpleDateFormat formatter = new SimpleDateFormat(ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
        return formatter.format(dateDate);
    }

    /**
     * 将短时间格式时间转换为字符串 yyyy-MM-dd 当前时间加1分钟
     *
     * @param dateDate Date
     * @return String
     */
    public static String date(Date dateDate) {
        LocalDateTime now = date2LocalDateTime(dateDate);
        LocalDateTime localDateTime = now.plusMinutes(1);
        DateTimeFormatter formatters = DateTimeFormatter.ofPattern(ConstantUtil.DATE_TIME_FORMAT_GENERAL);
        return formatters.format(localDateTime);
    }

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

    /**
     * LocalDateTime 转 Date
     *
     * @param localDateTime LocalDateTime
     * @return Date
     */
    public static Date localDateTimeDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 将短时间格式时间转换为字符串 yyyyMMdd
     *
     * @param dateDate String
     * @return String
     */
    public static String dateString(Date dateDate) {
        SimpleDateFormat formatter = new SimpleDateFormat(ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_TWO);
        return formatter.format(dateDate);
    }

    /**
     * 将短时间格式字符串转换为时间 yyyy-MM-dd
     *
     * @param strDate String
     * @return Date
     */
    public static Date strToDate(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat(ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_THREE);
        ParsePosition pos = new ParsePosition(0);
        return formatter.parse(strDate, pos);
    }

    /**
     * 将短时间格式字符串转换为时间 yyyyMMdd
     *
     * @param strDate String
     * @return Date
     */
    public static Date strDate(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat(ConstantUtil.DATE_TIME_FORMAT_GENERAL_WITHOUT_HOUR_TWO);
        ParsePosition pos = new ParsePosition(0);
        return formatter.parse(strDate, pos);
    }


    /**
     * 校验字符串是否为合法的日期格式
     *
     * @param strDate String
     * @param format  String
     * @return boolean
     */
    public static boolean isValidDate(String strDate, String format) {
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
            simpleDateFormat.setLenient(false);
            return null != simpleDateFormat.parse(strDate);
        } catch (ParseException e) {
            LOGGER.error("error message: 校验字符串是否为合法的日期格式,数据异常,原因:", e);
            return false;
        }
    }

    /**
     * 判断日期是否有效
     *
     * @param date       String,日期
     * @param dateFormat String,日期格式
     * @return boolean True-日期有效 False-日期无效
     */
    public static boolean isDateValid(String date, String dateFormat) {
        if (StringUtil.isEmpty(date) || StringUtil.isEmpty(dateFormat)) {
            return false;
        }
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat.replace("y", "u"))
                    .withResolverStyle(ResolverStyle.STRICT);
            return LocalDate.parse(date, dateTimeFormatter) != null;
        } catch (Exception e) {
            LOGGER.error("error message: 日期 <{}> 验证不通过,原因", date, e);
            return false;
        }
    }

    /**
     * 获取形如 20210819、2021-08-19、19:19等 形式的当前日期(含时间)
     *
     * @param dateTimeFormat String,日期格式
     * @return String 当前日期(含时间),形如 20210819、2021-08-19、19:19等
     */
    public static String getCurrentLocalDateWithSpecialFormat(String dateTimeFormat) {
        // 线程不安全 'new SimpleDateFormat(dateTimeFormat).format(Calendar.getInstance().getTime())'
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateTimeFormat));
    }

    /**
     * str 类型的日期比较
     *
     * @param str1           String 日期1
     * @param str2           String 日期2
     * @param dateTimeFormat String 日期格式
     * @return int -2:待对比的数据异常 -1: 日期1 < 日期2; 0: 日期1 = 日期2; 1: 日期1 > 日期2
     */
    public static int dateCompare(String str1, String str2, String dateTimeFormat) {
        try {
            if (StringUtil.isEmpty(str1) || StringUtil.isEmpty(str2)) {
                return -2;
            }
            LocalDate date1 = stringToLocalDate(str1, dateTimeFormat);
            LocalDate date2 = stringToLocalDate(str2, dateTimeFormat);
            return date1.compareTo(date2);
        } catch (Exception e) {
            LOGGER.error("error message: 日期比较异常,原因:<{}>", String.valueOf(e));
            throw new BusinessException((SystemErrorCode.DATE_CONVERT_FAILED));
        }
    }

    /**
     * 将 unix 时间戳转换为 相应时区时间
     *
     * @param instant       Instant
     * @param zoneIdType    SystemEnumEntity.ZoneIdType
     * @param dateFormatter String
     * @return String
     */
    public static String instantToString(Instant instant,
                                         SystemEnumEntity.ZoneIdType zoneIdType,
                                         String dateFormatter) {
        if (null == instant ||
                null == zoneIdType ||
                StringUtil.isEmpty(dateFormatter)) {
            return "";
        }
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormatter)
                    .withZone(ZoneId.of(zoneIdType.getLabel()));
            return dateTimeFormatter.format(instant);
        } catch (Exception e) {
            LOGGER.error("error message: 时间转换异常,原因是 ", e);
            return "";
        }
    }

    /**
     * 将 String 时间转换为 相应时区下的时间戳
     *
     * @param dateTime      String
     * @param zoneIdType    SystemEnumEntity.ZoneIdType
     * @param dateFormatter String
     * @return Instant
     */
    public static Instant stringToInstant(String dateTime,
                                          SystemEnumEntity.ZoneIdType zoneIdType,
                                          String dateFormatter) throws BusinessException {
        if (StringUtil.isEmpty(dateTime) ||
                null == zoneIdType ||
                StringUtil.isEmpty(dateFormatter)) {
            throw new BusinessException(GuiErrorCode.ACCESS_PARAMETER_INVALID);
        }
        try {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormatter);
            LocalDateTime localDateTime = LocalDateTime.parse(dateTime, dateTimeFormatter);
            return localDateTime.atZone(ZoneId.of(zoneIdType.getLabel())).toInstant();
        } catch (Exception e) {
            LOGGER.error("error message: 字符串格式时间 <{}> 转换为 Instant 异常,原因是", dateTime, e);
            throw new BusinessException(SystemErrorCode.DATE_CONVERT_FAILED);
        }
    }

    /**
     * 校验时间间隔
     *
     * @param start          String 时间间隔开始时间
     * @param end            String 时间间隔结束时间
     * @param dateTimeFormat String 时间格式
     * @return boolean True-时间间隔无效 False—时间间隔有效
     */
    public static boolean isIntervalInvalid(String start, String end, String dateTimeFormat) {
        if (StringUtil.isEmpty(start)
                || StringUtil.isEmpty(end)
                || StringUtil.isEmpty(dateTimeFormat)) {
            LOGGER.error("error message: 待校验时间间隔参数无效 <start> <{}>, <end> <{}>, <dateTimeFormat> <{}>", start, end, dateTimeFormat);
            return true;
        }
        try {
            if (!isDateValid(start, dateTimeFormat)
                    || !isDateValid(end, dateTimeFormat)) {
                LOGGER.error("error message: 待间间隔开始时间 <start> <{}>, 时间间隔结束时间 <end> <{}> 不是对应的日期格式 <dateTimeFormat> <{}>", start, end, dateTimeFormat);
                return true;
            }
            return dateCompare(start, end, dateTimeFormat) > 0;
        } catch (Exception e) {
            LOGGER.error("error message: 待校验校验时间间隔参数异常,原因:", e);
            return true;
        }
    }

    /**
     * 将 Date 转为 LocalDate
     *
     * @param date Date
     * @return java.time.LocalDate;
     */
    public static LocalDate dateToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * 将 LocalDateTime 转换为对应的格式的字符串
     *
     * @param localDateTime  LocalDateTime
     * @param dateTimeFormat String 时间格式
     * @return String
     * @throws BusinessException 异常
     */
    public static String localDateTimeToString(LocalDateTime localDateTime, String dateTimeFormat) throws BusinessException {
        try {
            if (null == localDateTime
                    || StringUtil.isEmpty(dateTimeFormat)) {
                LOGGER.error("error message: 待转换日期 <{}> , 时间格式 <{}> 参数无效", localDateTime, dateTimeFormat);
                throw new BusinessException((SystemErrorCode.DATE_CONVERT_FAILED));
            }
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateTimeFormat);
            return dateTimeFormatter.format(localDateTime);
        } catch (Exception e) {
            LOGGER.error("error message: LocalDateTime  <{}>  转换为字符串格式 <{}>异常,原因是 <{}>", localDateTime, dateTimeFormat, e);
            throw new BusinessException((SystemErrorCode.DATE_CONVERT_FAILED));
        }
    }

    /**
     * 日期范围查询参数校验
     *
     * @param rangeDate      RangeDateVO 日期范围查询VO
     * @param dateTimeFormat String 时间格式 如 yyyyMMdd
     * @param bothRequired   boolean True- 日期范围开始日期与结束日期都必须指定 False-日期范围开始日期与结束日期二者可选
     * @return boolean True- 日期范围查询参数无效 False- 日期范围查询参数有效
     */
    public static boolean isRangeDateInvalid(RangeDateVO rangeDate, String dateTimeFormat, boolean bothRequired) {

        try {
            if (null == rangeDate
                    || StringUtil.isEmpty(dateTimeFormat)) {
                LOGGER.error("error message: 待校验日期范围 <rangeDate> <{}>, <dateTimeFormat> <{} >参数无效", rangeDate, dateTimeFormat);
                return true;
            }
            // 开始日期与结束日期两者都必须指定的场合
            if (bothRequired) {
                return isIntervalInvalid(rangeDate.getStartDate(), rangeDate.getEndDate(), dateTimeFormat);
            }
            // 开始日期与结束日期两者两者可选
            else {
                if (StringUtil.isEmpty(rangeDate.getStartDate())
                        && StringUtil.isEmpty(rangeDate.getEndDate())) {
                    return true;
                } else if (!StringUtil.isEmpty(rangeDate.getStartDate())
                        && StringUtil.isEmpty(rangeDate.getEndDate())) {
                    return !isValidDate(rangeDate.getStartDate(), dateTimeFormat);
                } else if (StringUtil.isEmpty(rangeDate.getStartDate())
                        && !StringUtil.isEmpty(rangeDate.getEndDate())) {
                    return !isValidDate(rangeDate.getEndDate(), dateTimeFormat);
                } else {
                    return isIntervalInvalid(rangeDate.getStartDate(), rangeDate.getEndDate(), dateTimeFormat);
                }
            }
        } catch (Exception e) {
            LOGGER.error("error message: 待校验期范围异常, 原因是:", e);
            return true;
        }
    }


}

主要是针对时间格式,相互转换以及校验的工具类,希望对大家有所帮助!!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要进行datelocaldatelocaldatetimestring之间的相互转换,可以使用Java 8中的DateTimeFormatter和相关类来实现。 1. 将String转换LocalDateTime: 使用DateTimeFormatter的ofPattern方法指定日期时间的格式,然后使用LocalDateTime的parse方法将String转换LocalDateTime对象。例如: ```java String dateStr = "2020-07-20 15:54:41"; String pattern = "yyyy-MM-dd HH:mm:ss"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); LocalDateTime localDateTime = LocalDateTime.parse(dateStr, dateTimeFormatter); ``` 2. 将LocalDateTime转换String: 使用DateTimeFormatter的ofPattern方法指定日期时间的格式,然后使用LocalDateTime的format方法将LocalDateTime对象转换String。例如: ```java LocalDateTime localDateTime = LocalDateTime.now(); String pattern = "yyyy-MM-dd HH:mm:ss"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); String dateStr = localDateTime.format(dateTimeFormatter); ``` 3. 将String转换LocalDate: 使用DateTimeFormatter的ofPattern方法指定日期的格式,然后使用LocalDate的parse方法将String转换LocalDate对象。例如: ```java String dateStr = "2021-06-15"; String pattern = "yyyy-MM-dd"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); LocalDate localDate = LocalDate.parse(dateStr, dateTimeFormatter); ``` 4. 将LocalDate转换String: 使用DateTimeFormatter的ofPattern方法指定日期的格式,然后使用LocalDate的format方法将LocalDate对象转换String。例如: ```java LocalDate localDate = LocalDate.now(); String pattern = "yyyy-MM-dd"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); String dateStr = localDate.format(dateTimeFormatter); ``` 请注意,以上代码示例仅供参考,具体的实现方式可以根据实际需求进行调整。 #### 引用[.reference_title] - *1* [LocalDateLocalDateTime的各种转换形式](https://blog.csdn.net/zzti_erlie/article/details/100657394)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [LocalDate & LocalDateTime互相转换](https://blog.csdn.net/weixin_45103793/article/details/117929986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值