记录下自己日常开发中用到的时间工具类

这只是我在日常开发中自定义的时间工具类,其中的异常捕获读者们可以根据自己自定义的异常类来接收。

/**
 * LocalDateTime 时间类型工具类
 *
 * @author feifei
 */
public class LocalDateTimeUtil {

    public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_PATTERN = "yyyy-MM-dd";
    public static final String TIME_PATTERN = "HH:mm:ss";
    public static final String SPLIT_STR = " ~ ";

    /**
     * 将时间类型转换为字符串,转换格式自定义
     *
     * @param dateTime 时间
     * @param pattern  转换格式
     * @return
     */
    public static String formatDateTime2Str(LocalDateTime dateTime, String pattern) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
        return dateTimeFormatter.format(dateTime);
    }

    /**
     * 将时间类型转换为年月日时分秒的字符串类型, 转换格式:yyyy-MM-dd HH:mm:ss
     * ps: 2018-01-01 12:12:12
     *
     * @param dateTime 时间
     * @return
     */
    public static String formatDateTime2Str(LocalDateTime dateTime) {
        return formatDateTime2Str(dateTime, DATE_TIME_PATTERN);
    }

    /**
     * 将时间类型转换为年月日的字符串类型,转换格式为:yyyy-MM-dd
     * ps: 2018-01-01
     *
     * @param dateTime 时间
     * @return
     */
    public static String formatDate2Str(LocalDateTime dateTime) {
        return formatDateTime2Str(dateTime, DATE_PATTERN);
    }

    /**
     * 将时间类型转换为时分秒的字符串格式,转换格式为:HH:mm:ss
     *
     * @param dateTime 时间
     * @return
     */
    public static String formatTime2Str(LocalDateTime dateTime) {
        return formatDateTime2Str(dateTime, TIME_PATTERN);
    }

//    /**
//     * 将字符串类型转换为时间类型, 其他转换格式会出现错误,暂不做处理
//     * @param dateTime 时间字符串
//     * @param pattern 转换格式
//     * @return
//     */
//    @Deprecated
//    public static LocalDateTime parseStr2LocalDateTime(String dateTime, String pattern) {
//        return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(pattern));
//    }

    /**
     * 将字符串类型转换为时间类型, 仅支持 {@code yyyy-MM-dd HH:mm:ss} 格式类型
     *
     * @param dateTime 时间字符串
     * @return
     */
    public static LocalDateTime parseStr2LocalDateTime(String dateTime) throws RuntimeException {
//        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
//                .appendPattern("yyyy-MM-dd[['T'HH][:mm][:ss]]")
//                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
//                .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
//                .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
//                .parseDefaulting(ChronoField.MILLI_OF_SECOND, 0)
//                .toFormatter();
//        return LocalDateTime.parse(dateTime, formatter);
        Asserts.notEmpty(dateTime, "时间字符串不可为空");
        try {
            // yyyy-MM-dd HH:mm:ss => 长度为19
            if (dateTime.length() < 19) {
                Date date = DateUtils.parseDate(dateTime, DATE_PATTERN);
                return date2LocalDateTime(date);
            }
            return LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(DATE_TIME_PATTERN));
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException("时间转换失败");
        }
    }

    /**
     * 将 {@link Date} 转换为 {@link LocalDateTime} 类型,时区默认为东8区(北京时间)
     */
    public static LocalDateTime date2LocalDateTime(Date date) {
        return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
    }


    /**
     * 将 {@link LocalDateTime} 转换为 {@link Date} 类型,时区默认为东8区(北京时间)
     */
    public static Date localDateTime2Date(LocalDateTime localDateTime) {
        return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
    }

    /**
     * 对时间区间进行分割
     * @return
     */
    public static String[] substringDate(String dateInterval) {
        if (StringUtils.isNotBlank(dateInterval)) {
            return dateInterval.trim().split(SPLIT_STR);
        }
        return new String[2];
    }

    /**
     * 获取一段时间的每一天的年月日集合
     * @param start 开始时间
     * @param end 结束时间
     * @return
     */
    public static List getDateInterval(String start, String end) {
        LocalDate startDate = LocalDate.parse(start);
        LocalDate endDate = LocalDate.parse(end);

        if (startDate.isEqual(endDate)) {
            ArrayList result = new ArrayList<>(1);
            result.add(startDate.toString());
            return result;
        }

        // 获取天数区间
        long distance = getDayInterval(startDate, endDate);
        int capacity = (int) (distance + 1);
        // 获取时间区间,是为了创建ArrayList集合时,直接指定容量大小,
        // 防止出现天数间距过大, 造成ArrayList集合进行多次扩容,影响性能
        List list = new ArrayList<>(capacity);

        Stream.iterate(startDate, d -> d.plusDays(1)).limit(distance + 1).forEach(f -> list.add(f.toString()));

        return list;
    }

    /**
     * 获取年月日
     * @return
     */
    public static String getYYD(Date dateTime) {
        if (Objects.isNull(dateTime)) {
            throw new SuperCodeExtException("时间不可为空");
        }

        return DateFormatUtils.format(dateTime, "yyyy-MM-dd");
    }

    /**
     * 计算日期{@code startDate}与{@code endDate}的间隔天数
     * @return
     */
    public static long getDayInterval(LocalDate startDate, LocalDate endDate) {
        return ChronoUnit.DAYS.between(startDate, endDate);
    }
}

 

你可能感兴趣的:(记录下自己日常开发中用到的时间工具类)