LocalDateTimeUtils

LocalDateTimeUtils类

package com.yzp.utils.date;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * LocalDateTime 工具类
 *
 * @author YangZhiPeng
 * @date 2021-10-27 14:10
 */
//工具类注解
@UtilityClass
@Slf4j
    public class LocalDateTimeUtils {

    /**
     * 比较两个日期相差多少天
     *
     * @param time1 time1
     * @param time2 time2
     * @return 相差的天数
     */
    public long compareDays(LocalDateTime time1, LocalDateTime time2) {
        if (ObjectUtil.isEmpty(time1) || ObjectUtil.isEmpty(time2)) {
            log.error("比较两个日期相差多少天出现空日期");
            return 0;
        }
        return Duration.between(time1, time2).toDays();
    }

    /**
     * 比较两个日期相差多少小时
     *
     * @param time1 time1
     * @param time2 time2
     * @return 相差的天数
     */
    public long compareHours(LocalDateTime time1, LocalDateTime time2) {
        if (ObjectUtil.isEmpty(time1) || ObjectUtil.isEmpty(time2)) {
            log.error("比较两个日期相差多少小时出现空日期");
            return 0;
        }
        return Duration.between(time1, time2).toHours();
    }

    /**
     * 比较两个日期相差多少分钟
     *
     * @param time1 time1
     * @param time2 time2
     * @return 相差的天数
     */
    public long compareMinutes(LocalDateTime time1, LocalDateTime time2) {
        if (ObjectUtil.isEmpty(time1) || ObjectUtil.isEmpty(time2)) {
            log.error("比较两个日期相差多少分钟出现空日期");
            return 0;
        }
        return Duration.between(time1, time2).toMinutes();
    }

    /**
     * 比较两个日期相差多少小时,多余的直接进+1小时
     *
     * @param time1 time1
     * @param time2 time2
     * @return 相差的小时数
     */
    public long compareHoursEnter(LocalDateTime time1, LocalDateTime time2) {
        if (ObjectUtil.isEmpty(time1) || ObjectUtil.isEmpty(time2)) {
            log.error("比较两个日期相差多少小时出现空日期");
            return 0;
        }
        long hours = Duration.between(time1, time2).toHours();
        //是否多余了分钟,秒忽略不算
        if (Duration.between(time1, time2).toMinutes() - (hours * 60) > 0) {
            hours = hours + 1;
        }
        return hours;
    }

    /**
     * 两个时间相差距离多少天多少小时多少分多少秒
     *
     * @param startTime 时间参数 1 格式:1990-01-01 12:00:00
     * @param endTime   时间参数 2 格式:2009-01-01 12:00:00
     * @return String 返回值为:xx天xx时xx分xx秒
     */
    public static String getDistanceTime(String startTime, String endTime) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date one;
        Date two;
        long day = 0;
        long hour = 0;
        long min = 0;
        long sec = 0;
        try {
            one = df.parse(startTime);
            two = df.parse(endTime);
            long time1 = one.getTime();
            long time2 = two.getTime();
            long diff;
            if (time1 < time2) {
                diff = time2 - time1;
            } else {
                diff = time1 - time2;
            }
            day = diff / (24 * 60 * 60 * 1000);
            hour = (diff / (60 * 60 * 1000) - day * 24);
            min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
            sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        } catch (ParseException e) {
            log.error("比较两个时间相差距离异常:{}", e.getMessage());
        }
        return day + "天" + hour + "时" + min + "分" + sec + "秒";
    }

    /**
     * 获取两个时间点的月份差
     *
     * @param dt1 第一个时间点
     * @param dt2 第二个时间点
     * @return int,即需求的月数差
     */
    public int monthDiff(LocalDateTime dt1, LocalDateTime dt2) {
        //获取第一个时间点的月份
        int month1 = dt1.getMonthValue();
        //获取第一个时间点的年份
        int year1 = dt1.getYear();
        //获取第一个时间点的月份
        int month2 = dt2.getMonthValue();
        //获取第一个时间点的年份
        int year2 = dt2.getYear();
        //返回两个时间点的月数差
        return (year2 - year1) * 12 + (month2 - month1);
    }

    /**
     * 比较 time1是否BETWEEN time2 AND time3
     *
     * @param time1 time1
     * @param time2 time2
     * @param time3 time3
     * @return Boolean
     */
    public Boolean compareBetween(LocalDateTime time1, LocalDateTime time2, LocalDateTime time3) {
        if (ObjectUtil.isEmpty(time1) || ObjectUtil.isEmpty(time2) || ObjectUtil.isEmpty(time3)) {
            log.error("比较 time1是否BETWEEN time2 AND time3出现空日期");
            return Boolean.FALSE;
        }

        if (time1.isAfter(time2) && time1.isBefore(time3)) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }

    /**
     * 判断两个时间段是否重叠
     *
     * @param slot1 slot1
     * @param slot2 slot2
     * @return boolean
     */
    public static boolean overlapped(TimeSlot slot1, TimeSlot slot2) {
        TimeSlot previous, next;
        previous = slot1.startTime.isBefore(slot2.startTime) ? slot1 : slot2;
        next = slot2.startTime.isAfter(slot1.startTime) ? slot2 : slot1;
        // 这里业务需要,允许时间点的重叠
        // 例如某个时间段的起始时间:2020-06-29 00:00:00
        // 和另一个时间段的终止时间:2020-06-29 00:00:00
        // 它们俩可以有交点。如果不需要这种逻辑只把le改成lt
        // ,ge改成gt就可
        return !(le(previous, next) || ge(previous, next));
    }

    /**
     * 构造一个时间段
     *
     * @param startTime startTime
     * @param endTime   endTime
     * @return TimeSlot
     */
    public static TimeSlot buildSlot(LocalDateTime startTime, LocalDateTime endTime) {
        return new TimeSlot(startTime, endTime);
    }

    /**
     * less equal
     * 小于等于
     *
     * @param prev prev
     * @param next next
     * @return boolean
     */
    private static boolean le(TimeSlot prev, TimeSlot next) {
        return lt(prev, next) || next.endTime.isEqual(prev.startTime);
    }

    /**
     * greater equal
     * 大于等于
     *
     * @param prev prev
     * @param next next
     * @return boolean
     */
    private static boolean ge(TimeSlot prev, TimeSlot next) {
        return gt(prev, next) || prev.endTime.isEqual(next.startTime);
    }

    /**
     * greater than
     * 大于
     *
     * @param prev prev
     * @param next next
     * @return boolean
     */
    private static boolean gt(TimeSlot prev, TimeSlot next) {
        return prev.endTime.isBefore(next.startTime);
    }

    /**
     * less than
     * 小于
     *
     * @param prev prev
     * @param next next
     * @return boolean
     */
    private static boolean lt(TimeSlot prev, TimeSlot next) {
        return next.endTime.isBefore(prev.startTime);
    }

    /**
     * 时间段类
     */
    @Data
    static class TimeSlot {
        private LocalDateTime startTime;
        private LocalDateTime endTime;

        public TimeSlot(LocalDateTime startTime, LocalDateTime endTime) {
            if (startTime.isAfter(endTime)) {
                this.startTime = endTime;
                this.endTime = startTime;
            } else {
                this.startTime = startTime;
                this.endTime = endTime;
            }
        }
    }

    /**
     * 获取今天的时间范围
     *
     * @param day 0今天,-1昨天 1明天
     * @return 返回长度为2的字符串集合,如:[2022-11-11 00:00:00, 2022-11-11 24:00:00]
     */
    public static List<LocalDateTime> getToday(Integer day) {
        List<LocalDateTime> dataList = new ArrayList<>(2);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.DATE, day);
        String today = dateFormat.format(calendar.getTime());
        dataList.add(LocalDateTime.parse(today + " 00:00:00", DatePattern.NORM_DATETIME_FORMATTER));
        dataList.add(LocalDateTime.parse(today + " 24:00:00", DatePattern.NORM_DATETIME_FORMATTER));
        return dataList;
    }

    /**
     * 获取本周的时间范围
     *
     * @return 返回长度为2的字符串集合,如:[2022-05-02 00:00:00, 2022-05-08 24:00:00]
     */
    public static List<LocalDateTime> getCurrentWeek() {

        List<LocalDateTime> dataList = new ArrayList<>(2);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setFirstDayOfWeek(Calendar.MONDAY);//设置周一为一周之内的第一天
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        LocalDateTime monday = LocalDateTime.parse(dateFormat.format(calendar.getTime()) + " 00:00:00", DatePattern.NORM_DATETIME_FORMATTER);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        LocalDateTime sunday = LocalDateTime.parse(dateFormat.format(calendar.getTime()) + " 24:00:00", DatePattern.NORM_DATETIME_FORMATTER);
        dataList.add(monday);
        dataList.add(sunday);
        return dataList;
    }

    /**
     * 获取本月的时间范围
     *
     * @param month month
     * @return 返回长度为2的字符串集合,如:[2022-11-01 00:00:00, 2022-11-30 24:00:00]
     */
    public static List<LocalDateTime> getCurrentMonth(Integer month) {

        List<LocalDateTime> dataList = new ArrayList<>(2);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.MONTH, month);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        LocalDateTime firstDayOfMonth = LocalDateTime.parse(dateFormat.format(calendar.getTime()) + " 00:00:00", DatePattern.NORM_DATETIME_FORMATTER);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, 0);
        LocalDateTime lastDayOfMonth = LocalDateTime.parse(dateFormat.format(calendar.getTime()) + " 24:00:00", DatePattern.NORM_DATETIME_FORMATTER);
        dataList.add(firstDayOfMonth);
        dataList.add(lastDayOfMonth);
        return dataList;
    }

    /**
     * 获取本年的时间范围
     *
     * @return 返回长度为2的字符串集合,如:[2022-01-01 00:00:00, 2022-12-31 24:00:00]
     */
    public static List<String> getCurrentYear() {

        List<String> dataList = new ArrayList<>(2);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.YEAR, 0);
        calendar.set(Calendar.DAY_OF_YEAR, 1);
        String firstDayOfYear = dateFormat.format(calendar.getTime()) + " 00:00:00";
        calendar.add(Calendar.YEAR, 1);
        calendar.set(Calendar.DAY_OF_YEAR, 0);
        String lastDayOfYear = dateFormat.format(calendar.getTime()) + " 24:00:00";
        dataList.add(firstDayOfYear);
        dataList.add(lastDayOfYear);
        return dataList;
    }

    /**
     * 周一 ===》周日集合排序
     *
     * @param arr list
     * @return sort
     */
    public List<String> handleWeekSort(List<String> arr) {
        //冒泡排序
        for (int i = 0; i < arr.size() - 1; i++) {
            boolean flag = true;
            for (int j = 0; j < arr.size() - i - 1; j++) {
                //巧妙的值转换
                if (returnWeek(arr.get(j)) > returnWeek(arr.get(j + 1))) {
                    String temp = arr.get(j);
                    arr.set(j, arr.get(j + 1));
                    arr.set(j + 1, temp);
                    // 改变flag,提前结束
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
        return arr;
    }

    /**
     * 返回周几对应数字
     *
     * @param var 值
     * @return int
     */
    public int returnWeek(String var) {
        switch (var) {
            case "周一":
                return 1;
            case "周二":
                return 2;
            case "周三":
                return 3;
            case "周四":
                return 4;
            case "周五":
                return 5;
            case "周六":
                return 6;
            case "周日":
                return 7;
        }
        return 0;
    }
    
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
package com.aapoint.util; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; public class LocalDateTimeUtil { /** * 比较 localDateTime2 是否在localDateTime1之前(比较大小) * @param localDateTime1 * @param localDateTime2 * @return */ public static Boolean compare(LocalDateTime localDateTime1,LocalDateTime localDateTime2){ return localDateTime1.isBefore(localDateTime2); } /** * 获取当前月份前/后的月份的第一天 * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String firstDay(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,0,i); //获取该月份的第一天 String firstDay = date.with(TemporalAdjusters.firstDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // System.out.println("第一天为:"+firstDay); return firstDay; } /** * 获取当前月份前/后的月份的最后一天 * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String lastDay(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,0,i); //获取该月份的最后一天 String lastDay = date.with(TemporalAdjusters.lastDayOfMonth()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // System.out.println("最后一天为:"+lastDay); return lastDay; } /** * 获取当时间前/后的时间(天) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainDay(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,1,i); //获取天 String day = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // System.out.println("获取的时间为(天):"+day); return day; } /** * 获取当时间前/后的时间(小时) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainHours(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,2,i); //获取该月份的最后一天 String hours = date.format(DateTimeFormatter.ofPattern("HH:mm:ss")); // System.out.println("获取的时间为(小时):"+hours); return hours; } /** * 获取当时间前/后的时间(小时) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainMinutes(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,3,i); //获取该月份的最后一天 String minutes = date.format(DateTimeFormatter.ofPattern("HH:mm:ss")); // System.out.println("获取的时间为(分钟):"+minutes); return minutes; } /** * 获取当时间前/后的时间(小时) * @param i 指定距离当前月份的时间 * @param state 状态 0.当月 1.前 2.后 * @return */ public static String obtainSeconds(Integer state,Integer i){ LocalDateTime date = null; //type 类型 0.月 1.天 2.小时 3.分钟 4.秒 date = getLocalDateTime(state,4,i); //获取该月份的最后一天 String seconds = date.format(DateTimeFormatter.ofPattern("HH:mm:ss")); // System.out.println("获取的时间为(秒):"+seconds); return seconds; } public static void main(String[] args) { System.out.println("当前时间为:"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); System.out.println("前一个月份的第一天为:"+LocalDateTimeUtil.firstDay(1,1)); System.out.println("前一个月份的最后一天为:"+LocalDateTimeUtil.lastDay(1,1)); System.out.println("当前时间的前一天为:"+LocalDateTimeUtil.obtainDay(1,1)); System.out.println("当前时间的后一天为:"+LocalDateTimeUtil.obtainDay(2,1)); System.out.println("当前时间的前一小时为:"+LocalDateTimeUtil.obtainHours(1,1)); System.out.println("当前时间的后一小时为:"+LocalDateTimeUtil.obtainHours(2,1)); System.out.println("当前时间的前一分钟为:"+LocalDateTimeUtil.obtainMinutes(1,1)); System.out.println("当前时间的后一分钟为:"+LocalDateTimeUtil.obtainMinutes(2,1)); System.out.println("当前时间的前一秒为:"+LocalDateTimeUtil.obtainSeconds(1,1)); System.out.println("当前时间的后一秒为:"+LocalDateTimeUtil.obtainSeconds(2,1)); } private static LocalDateTime getLocalDateTime(Integer state,Integer type,Integer i) { LocalDateTime date; if(state == 0){ date = LocalDateTime.now(); }else if(state == 1){ if(type == 0) { //获取月 date = LocalDateTime.now().minusMonths(i); }else if(type == 1){ //获取天 date = LocalDateTime.now().minusDays(i); }else if(type == 2){ //获取小时 date = LocalDateTime.now().minusHours(i); }else if(type == 3){ //获取分钟 date = LocalDateTime.now().minusMinutes(i);

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值