Java开发中日期加减操作工具类

Java开发中日期加减操作工具类


import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @author psq
 * @date 2022-06-06 23:30
 * @desc 线程安全的日期工具类
 */
public final class DateUtils {
    /**
     * 获取两个时间段之间的秒数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 秒数
     */
    public static Long getDurationSecconds(String startTime, String endTime, String pattern) {
        final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).getSeconds();
    }

    /**
     * 获取两个时间段之间的秒数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 秒数
     */
    public static Long getDurationSecconds(Date startTime, Date endTime, String pattern) {
        final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).getSeconds();
    }

    /**
     * 获取两个时间段之间的分钟数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 分钟数
     */
    public static Long getDurationMinutes(String startTime, String endTime, String pattern) {
        final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).toMinutes();
    }

    /**
     * 获取两个时间段之间的分钟数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 分钟数
     */
    public static Long getDurationMinutes(Date startTime, Date endTime, String pattern) {
        final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).toMinutes();
    }

    /**
     * 获取两个时间段之间的小时数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 小时
     */
    public static Long getDurationHours(String startTime, String endTime, String pattern) {
        final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).toHours();
    }

    /**
     * 获取两个时间段之间的小时数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 小时
     */
    public static Long getDurationHours(Date startTime, Date endTime, String pattern) {
        final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).toHours();
    }


    /**
     * 获取两个时间段之间的天数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 天数
     */
    public static Long getDurationDays(String startTime, String endTime, String pattern) {
        final LocalDateTime start = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).toDays();
    }

    /**
     * 获取两个时间段之间的天数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pattern   时间格式
     * @return 天数
     */
    public static Long getDurationDays(Date startTime, Date endTime, String pattern) {
        final SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        final LocalDateTime start = LocalDateTime.parse(sdf.format(startTime), DateTimeFormatter.ofPattern(pattern));
        final LocalDateTime end = LocalDateTime.parse(sdf.format(endTime), DateTimeFormatter.ofPattern(pattern));
        return Duration.between(start, end).toDays();
    }

    /**
     * 当前时间加上目标时间返回这两个时间之间的秒数
     *
     * @param target   目标时间
     * @param dateEnum 时间枚举
     * @return 秒数
     */
    public static Long currentDateSeccondsAddTarget(Long target, DateEnum dateEnum) throws IllegalAccessException {
        final LocalDateTime now = LocalDateTime.now();
        final LocalDateTime targetDate = getLocalDateTime(target, dateEnum, now);
        return Duration.between(now, targetDate).getSeconds();
    }


    /**
     * 自定义时间加上目标时间后返回的时间
     *
     * @param target       目标时间
     * @param dateEnum     时间枚举
     * @param customerDate 自定义时间
     * @param pattern      自定义时间模式
     * @return 结果时间
     * @throws IllegalAccessException
     */
    public static String customizeDateAddTargetDate(String customerDate, String pattern, Long target, DateEnum dateEnum) throws IllegalAccessException {
        final LocalDateTime customize = LocalDate.parse(customerDate, DateTimeFormatter.ofPattern(pattern)).atTime(LocalTime.now());
        final LocalDateTime targetDate = getLocalDateTime(target, dateEnum, customize);
        return targetDate.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 当前时间加上目标时间
     *
     * @param target   被加的时间 负数是 过去时间
     * @param dateEnum 时间枚举
     * @param pattern  返回的时间格式
     * @return 增加后的时间
     */
    public static String currentDateSeccondsAddTarget(Long target, DateEnum dateEnum, String pattern) throws IllegalAccessException {
        return getLocalDateTime(target, dateEnum, LocalDateTime.now()).format(DateTimeFormatter.ofPattern(pattern));
    }


    private static LocalDateTime getLocalDateTime(Long target, DateEnum dateEnum, LocalDateTime now) throws IllegalAccessException {
        LocalDateTime targetDate;
        if (dateEnum.name().equals(DateEnum.SECONDS.name())) {
            targetDate = now.plusSeconds(target);
        } else if (dateEnum.name().equals(DateEnum.MINUTES.name())) {
            targetDate = now.plusMinutes(target);
        } else if (dateEnum.name().equals(DateEnum.HOUR.name())) {
            targetDate = now.plusHours(target);
        } else if (dateEnum.name().equals(DateEnum.DAY.name())) {
            targetDate = now.plusDays(target);
        } else if (dateEnum.name().equals(DateEnum.MONTH.name())) {
            targetDate = now.plusMonths(target);
        } else if (dateEnum.name().equals(DateEnum.WEEK.name())) {
            targetDate = now.plusWeeks(target);
        } else if (dateEnum.name().equals(DateEnum.YEAR.name())) {
            targetDate = now.plusYears(target);
        } else {
            throw new IllegalAccessException("DateEnum object is Illegal");
        }
        return targetDate;
    }

    public static void main(String[] args) throws IllegalAccessException {
        //当前时间减去5天
        final String target = currentDateSeccondsAddTarget(Long.valueOf("-5"), DateEnum.DAY, "yyyy-MM-dd");
        System.out.println(target);
        //当前时间加上100天
        final Long aLong = currentDateSeccondsAddTarget(100L, DateEnum.DAY);
        System.out.println(aLong);
        //指定时间、指定格式加上目标天数
        final String targetDate = customizeDateAddTargetDate("2022-06-06", "yyyy-MM-dd", -3L, DateEnum.DAY);
        System.out.println(targetDate);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值