时间工具类

250 阅读2分钟

超详细的时间工具类,多样化时间类型转换进行操作,列如:String ,Long,Date,LocalDate,LocalDateTime都有相对应的转换

import org.apache.commons.lang3.StringUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Stream;

/**
 * @program: wym-parent
 * @description: 超详细时间工具类
 * @author: 尉一民
 * @create: 2022-04-02 09:13
 **/
public class LocalDateUtils {

    /**
     * 获取当前日期年/月/日(结束时间)
     *
     * @param localDateTime 当前时间
     * @param chronoUnit    单位:year 年,month 月,day 日
     * @return Long 时间戳
     * @author: 尉一民
     */
    public static Long getEndTime(LocalDateTime localDateTime, ChronoUnit chronoUnit) {
        LocalDate localDate = localDateTime.toLocalDate();
        LocalDate with = null;
        if (ChronoUnit.YEARS.equals(chronoUnit)) {
            with = localDate.with(TemporalAdjusters.lastDayOfYear());
        }
        if (ChronoUnit.MONTHS.equals(chronoUnit)) {
            with = localDate.with(TemporalAdjusters.lastDayOfMonth());
        }
        if (ChronoUnit.DAYS.equals(chronoUnit)) {
            return LocalDateTime.of(localDate, LocalTime.MAX)
                    .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
        }
        return with.atStartOfDay(ZoneId.systemDefault())
                .toInstant()
                .toEpochMilli();
    }

    /**
     * 获取当前日期年/月/日(开始时间)
     *
     * @param localDateTime 当前时间
     * @param chronoUnit    单位:year 年,month 月,day 日
     * @return Long 时间戳
     * @author: 尉一民
     */
    public static Long getStartTime(LocalDateTime localDateTime, ChronoUnit chronoUnit) {
        LocalDate localDate = localDateTime.toLocalDate();
        LocalDate with = null;
        if (ChronoUnit.YEARS.equals(chronoUnit)) {
            with = localDate.with(TemporalAdjusters.firstDayOfYear());
        }
        if (ChronoUnit.MONTHS.equals(chronoUnit)) {
            with = localDate.with(TemporalAdjusters.firstDayOfMonth());
        }
        if (ChronoUnit.DAYS.equals(chronoUnit)) {
            return LocalDateTime.of(localDate, LocalTime.MIN)
                    .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
        }
        return with.atStartOfDay(ZoneId.systemDefault())
                .toInstant()
                .toEpochMilli();
    }


    /**
     * 从大到小排序 2个日期间的所有日期
     *
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @param chronoUnit 年 years 月 month 日 days
     * @return List<LocalDate> 获取2个日期之间的所有日期
     * @author: 尉一民
     */
    public static List<LocalDate> getDescDateList(LocalDate startDate, LocalDate endDate, ChronoUnit chronoUnit) {
        List<LocalDate> result = new ArrayList<>();
        long dex = chronoUnit.between(startDate, endDate);
        if (dex > 0) {
            /*以endDate元素开始,日期自减1*/
            Stream.iterate(endDate, end -> end.minus(1, chronoUnit))
                    /*数组长度*/
                    .limit(dex + 1)
                    .forEach(date -> result.add(date));
        }
        return result;
    }


    /**
     * 从小到大排序 2个日期间的所有日期
     *
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @param chronoUnit 年 years 月 month 日 days
     * @return List<LocalDate> 获取2个日期之间的所有日期
     * @author weiyimin
     */
    public static List<LocalDate> getAscDateList(LocalDate startDate, LocalDate endDate, ChronoUnit chronoUnit) {
        List<LocalDate> result = new ArrayList<>();
        /*求2个日期之间的天数差*/
        long dex = chronoUnit.between(startDate, endDate);
        if (dex > 0) {
            /*以startDate元素开始,日期自加1*/
            Stream.iterate(startDate, start -> start.plus(1, chronoUnit))
                    /*数组长度*/
                    .limit(dex + 1)
                    .forEach(date -> result.add(date));
        }
        return result;
    }

    /**
     * 获取几天前开始时间
     * 当天开始时间 当天月份天数减1
     *
     * @param i         几天前
     * @param localTime 枚举:Min开始时间,Max结束时间
     * @return LocalDateTime
     * @author: 尉一民
     */
    public static LocalDateTime getBeginDayOfn(int i, LocalTime localTime) {
        LocalDate now = LocalDate.now().minusDays(i);
        LocalDateTime of = LocalDateTime.of(now, localTime);
        return of;
    }

    /**
     * 计算当前日期与{@code endDate}的间隔天数
     *
     * @param endDate 结束日期
     * @return 间隔天数
     * @author: 尉一民
     */
    public static long localDateCompare(LocalDate endDate) {
        return LocalDate.now().until(endDate, ChronoUnit.DAYS);
    }

    /**
     * 计算日期{@code startDate}与{@code endDate}的间隔天数
     *
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 间隔天数
     * @author: 尉一民
     */
    public static long localDateCompare(LocalDate startDate, LocalDate endDate) {
        return startDate.until(endDate, ChronoUnit.DAYS);
    }

    /**
     * 字符串转换成日期
     *
     * @param strDate 日期字符串
     * @param pattern 日期的格式
     * @return LocalDate
     * @author: 尉一民
     */
    public static LocalDate stringToLocalDate(String strDate, String pattern) {
        if (StringUtils.isBlank(strDate)) {
            return null;
        }
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern);
        return LocalDate.parse(strDate, fmt);
    }

    /**
     * 日期转String
     *
     * @param time    时间
     * @param pattern 时间单位("yyyy-MM-dd HH:mm:ss")
     * @return String
     * @author: 尉一民
     */
    public static String dateTimeToString(LocalDateTime time, String pattern) {
        String now = time.format(DateTimeFormatter.ofPattern(pattern));
        return now;
    }

    /**
     * Date转LocalDate
     *
     * @param date
     * @author: 尉一民
     */
    public static LocalDate dateToLocalDate(Date date) {
        if (null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * 当前日期增加{number}
     *
     * @param number     增加数
     * @param chronoUnit 单位:year 年,month 月,day 日
     * @return
     * @author: 尉一民
     */
    public static LocalDate addLocalDate(Long number, ChronoUnit chronoUnit) {
        LocalDate plus = LocalDate.now().plus(number, chronoUnit);
        return plus;
    }
}