日期时间工具类DateTimeUtil

package com.wgying.toolbox.util.time;

import org.apache.commons.lang3.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 日期时间工具类
 *
 * @author 
 * @date 
 */
public class DateTimeUtil {

    /* 默认的日期格式化样式(yyyy-MM-dd) */
    public static final String SIMPLE_DATE_PATTERN = "yyyy-MM-dd";
    public static final DateTimeFormatter SIMPLE_DATE_FORMATER = DateTimeFormatter.ofPattern(SIMPLE_DATE_PATTERN);
    /* 默认的时间格式化样式(HH:mm:ss) */
    public static final String TIME_PATTERN = "HH:mm:ss";
    public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern(TIME_PATTERN);
    /* 默认的日期时间格式化样式(yyyy-MM-dd HH:mm:ss) */
    public static final String FULL_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
    public static final DateTimeFormatter FULL_DATE_FORMATER = DateTimeFormatter.ofPattern(FULL_DATE_PATTERN);


    /**
     * String(timestamp) -> String(yyyy-MM-dd HH:mm:ss)
     *
     * @param timestamp 时间戳
     *
     * @return 日期时间
     */
    public static String stamp2DateTime(String timestamp) {
        if (StringUtils.isEmpty(timestamp)) {
            return null;
        }
        String dateTime;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FULL_DATE_PATTERN);
        long lt = new Long(timestamp);
        Date date = new Date(lt);
        dateTime = simpleDateFormat.format(date);
        return dateTime;
    }

    /**
     * String(yyyy-MM-dd HH:mm:ss) -> String(timestamp)
     *
     * @param dateTime 日期时间
     *
     * @return 时间戳
     *
     * @throws ParseException 解析异常
     */
    public static String dateTime2Stamp(String dateTime) throws ParseException {
        if (StringUtils.isEmpty(dateTime)) {
            return null;
        }
        String timestamp;
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FULL_DATE_PATTERN);
        Date date = simpleDateFormat.parse(dateTime);
        long ts = date.getTime();
        timestamp = String.valueOf(ts);
        return timestamp;
    }

    public static String formatLocalDate(LocalDate date, String pattern) {
        if (StringUtils.equals(pattern, "yyyyMMdd")) {
            return date.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
        } else if (StringUtils.equals(pattern, "yyyy-MM-dd")) {
            return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        } else {
            return null;
        }
    }

    /**
     * LocalDate -> String(yyyy-MM-dd)
     *
     * @param date localDate
     *
     * @return 组装的时间
     */
    public static String formatLocalDate(LocalDate date) {
        return date.format(SIMPLE_DATE_FORMATER);
    }

    /**
     * LocalTime -> String(HH:mm:ss)
     *
     * @param time localtime
     *
     * @return 组装的时间
     */
    public static String formatLocalDate(LocalTime time) {
        return time.format(TIME_FORMATTER);
    }

    /**
     * LocalDateTime -> String(yyyy-MM-dd HH:mm:ss)
     *
     * @param localDateTime localDateTime
     *
     * @return 组装的时间
     */
    public static String formatLocalDate(LocalDateTime localDateTime) {
        return localDateTime.format(FULL_DATE_FORMATER);
    }

    /**
     * 获取当前日期和时间
     *
     * @return 返回样例:2020-04-12 19:30:29
     */
    public static String getCurrentDateAndTime() {
        return format(new Date());
    }

    /**
     * 将Date格式化成默认日期时间格式的字符串(yyyy-MM-dd HH:mm:ss)
     *
     * @param date 日期时间
     *
     * @return 返回样例:2020-04-12 19:30:29
     */
    public static String format(Date date) {
        SimpleDateFormat formatTool = new SimpleDateFormat();
        formatTool.applyPattern(FULL_DATE_PATTERN);
        return formatTool.format(date);
    }

    /**
     * 将Date格式化成默认日期格式的字符串(yyyy-MM-dd)
     *
     * @param date 日期时间
     *
     * @return 返回样例:2020-04-12
     */
    public static String formatDate(Date date) {
        SimpleDateFormat formatTool = new SimpleDateFormat();
        formatTool.applyPattern(SIMPLE_DATE_PATTERN);
        return formatTool.format(date);
    }

    /**
     * 将Date格式化成默认时间格式的字符串(HH:mm:ss)
     *
     * @param date 日期时间
     *
     * @return 返回样例:19:30:29
     */
    public static String formatTime(Date date) {
        SimpleDateFormat formatTool = new SimpleDateFormat();
        formatTool.applyPattern(TIME_PATTERN);
        return formatTool.format(date);
    }

    /**
     * 按照指定pattern格式格式化Date
     *
     * @param date    日期时间
     * @param pattern 样例:yyyy/MM/dd
     *
     * @return 返回样例:2020/04/12
     */
    public static String format(Date date, String pattern) {
        SimpleDateFormat formatTool = new SimpleDateFormat();
        formatTool.applyPattern(pattern);
        return formatTool.format(date);
    }


    /**
     * 计算LocalDateTime时间差
     *
     * @param fromTime 起始时间
     * @param toTime   结束时间
     *
     * @return 相差的毫秒值
     */
    public static Long millsBetween(LocalDateTime fromTime, LocalDateTime toTime) {
        Duration between = Duration.between(fromTime, toTime);
        return between.toMillis();
    }

    /**
     * 毫秒值转换成时分秒毫秒
     *
     * @param mills 毫秒值
     *
     * @return 时分秒毫秒
     */
    public static String millsFormat(Long mills) {
        Integer ss = 1000;
        Integer mi = ss * 60;
        Integer hh = mi * 60;
        Integer dd = hh * 24;

        Long day = mills / dd;
        Long hour = (mills - day * dd) / hh;
        Long minute = (mills - day * dd - hour * hh) / mi;
        Long second = (mills - day * dd - hour * hh - minute * mi) / ss;
        Long milliSecond = mills - day * dd - hour * hh - minute * mi - second * ss;

        StringBuffer sb = new StringBuffer();
        if (day > 0) {
            sb.append(day + "天");
        }
        if (hour > 0) {
            sb.append(hour + "小时");
        }
        if (minute > 0) {
            sb.append(minute + "分");
        }
        if (second > 0) {
            sb.append(second + "秒");
        }
        if (milliSecond > 0) {
            sb.append(milliSecond + "毫秒");
        }
        return sb.toString();
    }

    /**
     * 日期天数计算:包含头尾
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 相差天数
     */
    public static long dateCount(Date start, Date end) {
        Objects.requireNonNull(start);
        Objects.requireNonNull(end);
        long days = (end.getTime() - start.getTime()) / (60 * 60 * 24 * 1000);
        return days + 1;
    }

    /**
     * 日期天数计算:包含头尾
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 相差天数
     */
    public static long dateCount(LocalDate start, LocalDate end) {
        Objects.requireNonNull(start);
        Objects.requireNonNull(end);

        Date startDate = Date.from(start.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
        Date endDate = Date.from(end.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

        return dateCount(startDate, endDate);
    }

    /**
     * 日期天数计算:不包含头尾
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 相差天数
     */
    public static long dateBetween(Date start, Date end) {
        Objects.requireNonNull(start);
        Objects.requireNonNull(end);
        long days = (end.getTime() - start.getTime()) / (60 * 60 * 24 * 1000);
        return days;
    }

    /**
     * 日期天数计算:不包含头尾
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 相差天数
     */
    public static long dateBetween(LocalDate start, LocalDate end) {
        Objects.requireNonNull(start);
        Objects.requireNonNull(end);

        Date startDate = Date.from(start.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
        Date endDate = Date.from(end.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

        return dateBetween(startDate, endDate);
    }

    /**
     * 计算两个日期的天数差距(忽略时分秒)
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 间隔天数,如果开始时间大于结束时间,返回值为负数
     */
    public static int countDaysIn(Date start, Date end) {

        LocalDate ldStart = start.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        LocalDate ldend = end.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

        return (int) (ldend.toEpochDay() - ldStart.toEpochDay());
    }

    /**
     * 比较两个Date是否是同一天
     *
     * @param date        第一个时间
     * @param anotherDate 第二个时间
     *
     * @return 是则返回true
     */
    public static boolean isSameDay(Date date, Date anotherDate) {

        Objects.requireNonNull(date);
        Objects.requireNonNull(anotherDate);

        String dateStr = formatDate(date);
        String anotherDateStr = formatDate(anotherDate);

        return dateStr.equals(anotherDateStr);
    }

    /**
     * 比较两个Date的时间是否是同时
     *
     * @param date        第一个时间
     * @param anotherDate 第二个时间
     *
     * @return 是则返回true
     */
    public static boolean isSameTime(Date date, Date anotherDate) {

        Objects.requireNonNull(date);
        Objects.requireNonNull(anotherDate);

        return formatTime(date).equals(formatTime(anotherDate));
    }

    /**
     * 计算两个日期的天数差距
     *
     * @param start 开始时间
     * @param end   结束时间
     *
     * @return 间隔天数,如果开始时间大于结束时间,返回值为负数
     */
    public static Long count2Date(Date start, Date end) {
        Long diff = (start.getTime() - end.getTime()) / 86400000;
        return Math.abs(diff);
    }

    /**
     * 比较第一个时间是否晚于第二个时间
     *
     * @param date        第一个时间
     * @param anotherDate 第二个时间
     *
     * @return 是则返回true
     */
    public static boolean isTimeAfter(Date date, Date anotherDate) {

        Objects.requireNonNull(date);
        Objects.requireNonNull(anotherDate);

        return formatTime(date).compareTo(formatTime(anotherDate)) > 0;
    }

    /**
     * 比较第一个日期是否晚于第二个日期
     *
     * @param date        第一个日期
     * @param anotherDate 第二个日期
     *
     * @return 是则返回true
     */
    public static Boolean isDateAfter(Date date, Date anotherDate) {

        String dateStr = format(date, SIMPLE_DATE_PATTERN);
        String anotherDateStr = format(anotherDate, SIMPLE_DATE_PATTERN);

        return dateStr.compareTo(anotherDateStr) > 0;
    }

    /**
     * Date -> LocalDate
     *
     * @param date 日期
     *
     * @return localDate
     */
    public static LocalDate transDate2LocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * LocalDate -> Date
     *
     * @param localDate 日期
     *
     * @return date
     */
    public static Date transLocalDate2Date(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }

    /**
     * Date -> LocalDateTime
     *
     * @param date 日期
     *
     * @return localDateTime
     */
    public static LocalDateTime transDate2LocalDateTime(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    /**
     * LocalDateTime -> Date
     *
     * @param localDateTime 日期
     *
     * @return date
     */
    public static Date transLocalDateTime2Date(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * Date -> LocalTime
     *
     * @param date 日期
     *
     * @return localTime
     */
    public static LocalTime transDate2LocalTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalTime();
    }


    public static List<LocalDate> findEveryDay(String beginTime, String endTime) {

        List<LocalDate> dateList = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date begin = simpleDateFormat.parse(beginTime);
            Date end = simpleDateFormat.parse(endTime);

            dateList.add(transDate2LocalDate(begin));
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(begin);
            while (end.after(calendar.getTime())) {
                calendar.add(Calendar.DAY_OF_MONTH, 1);
                dateList.add(transDate2LocalDate(calendar.getTime()));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return dateList;
    }


    public static List<LocalDateTime> findEveryHour(LocalDate date, Integer days) {

        LocalDate endDate = date.plusDays(days);
        List<LocalDateTime> hourList = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date begin = transLocalDate2Date(date);
        Date end = transLocalDate2Date(endDate);

        hourList.add(date.atStartOfDay());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        while (end.after(calendar.getTime())) {
            calendar.add(Calendar.HOUR_OF_DAY, 4);
            if (end.after(calendar.getTime())) {
                hourList.add(transDate2LocalDateTime(calendar.getTime()));
            }
        }
        return hourList;
    }

    public static List<LocalDateTime> findEveryQuarterHour(LocalDate date, Integer days) {

        LocalDate endDate = date.plusDays(days);
        List<LocalDateTime> hourList = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date begin = transLocalDate2Date(date);
        Date end = transLocalDate2Date(endDate);

        hourList.add(date.atStartOfDay());
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        while (end.after(calendar.getTime())) {
            calendar.add(Calendar.MINUTE, 15);
            if (end.after(calendar.getTime())) {
                hourList.add(transDate2LocalDateTime(calendar.getTime()));
            }
        }
        return hourList;
    }

    public static List<LocalDateTime> findEveryTenMinutes(LocalDateTime startHour, LocalDateTime endHour) {

        List<LocalDateTime> tenMinutesList = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date begin = transLocalDateTime2Date(startHour);
        Date end = transLocalDateTime2Date(endHour);

        tenMinutesList.add(startHour);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        while (end.after(calendar.getTime())) {
            calendar.add(Calendar.MINUTE, 10);
            if (end.after(calendar.getTime())) {
                tenMinutesList.add(transDate2LocalDateTime(calendar.getTime()));
            }
        }
        return tenMinutesList;
    }

    public static LocalDateTime getNextHour(LocalDateTime localDateTime) {

        Date begin = transLocalDateTime2Date(localDateTime);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        calendar.add(Calendar.HOUR_OF_DAY, 4);
        LocalDateTime nextHour = transDate2LocalDateTime(calendar.getTime());
        return nextHour;
    }

    public static LocalDateTime getHalfHour(LocalDateTime localDateTime) {

        Date begin = transLocalDateTime2Date(localDateTime);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        calendar.add(Calendar.MINUTE, 30);
        LocalDateTime nextHour = transDate2LocalDateTime(calendar.getTime());
        return nextHour;
    }

    public static LocalDateTime getNextQuarterHour(LocalDateTime localDateTime) {

        Date begin = transLocalDateTime2Date(localDateTime);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        calendar.add(Calendar.MINUTE, 15);
        LocalDateTime nextHour = transDate2LocalDateTime(calendar.getTime());
        return nextHour;
    }

    public static LocalDateTime getNextTenMinutes(LocalDateTime localDateTime) {

        Date begin = transLocalDateTime2Date(localDateTime);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        calendar.add(Calendar.MINUTE, 10);
        LocalDateTime nextHour = transDate2LocalDateTime(calendar.getTime());
        return nextHour;
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值