java计算时间 跳过非工作时间

 关键字

DateUtil.offsetDay(’2024-3-7 15:30:00‘, 1)         给这个时间+几天= 2024-3-8 15:30:00

DateUtil.beginOfDay("2024-3-7 15:30:00“);       获取时间的起始日=2024-3-7 00:00:00

DateUtil.offsetHour(”2024-3-7 00:00:00", 9)       给时间往后推小时=2024-3-7 09:00:00

DateUtil.offsetMinute("2024-3-7 00:00:00'; 30)   给时间往后推分钟=2024-3-7 00:30:00

DateUtil.between(2024-3-7 00:00:00,2024-3-7 00:30:00, DateUnit.MINUTE)  计算两个时间之间相差的分钟并取绝对值

    public static Date doGetSkipNonWorkTimeByMinutes(Date currentTime,int numMinute){
        //变量------>numMinute分钟后的时间
        Date futureTime = null;
        //获取当前时间的小时
        int currentHour = DateUtil.hour(currentTime, true);
        //每天的工作时间----->上午9点到下午18点(分钟)
        int workTimeMinuteEverDay = (18-9)*60;
        //延长的分钟除工作时间------>计算需要延长多少天
        int num=numMinute/workTimeMinuteEverDay;
        //判定当前时间区间
        //大于等于下午18点
        if (currentHour >= 18) {
            //增加天(不算今天)
            //原始日期+ (延长的分钟除工作时间---->计算多少天+ 1)
            futureTime = DateUtil.offsetDay(currentTime, num+1);
            //原始日期+ (越长的分钟除工作时间---->计算多少天+ 1)后的时间起始日
            futureTime = DateUtil.beginOfDay(futureTime);
            //原始日期+ (延长的分钟除工作时间---->计算多少天+ 1)后的时间起始日后的9小时
            futureTime = DateUtil.offsetHour(futureTime, 9);
            //增加时间差值
            if (num>0){
                //变更后日期= (延 长的分钟除工作时间---->计算多少天+ 1)后的时间起始日后的9小时+延长的分钟数(numMinute) -起长的分钟除工作时间(num)★每天的工作时间
                futureTime = DateUtil.offsetMinute(futureTime, numMinute-num*workTimeMinuteEverDay);
            }else{
                //不足一天不用计算差值
                //变吏后日期= ( 延长的分钟除工作时间---->计算多少天+ 1)后的时间起始日后的9小时+延长的分钭数(numMinute)
                futureTime = DateUtil.offsetMinute(futureTime, numMinute);
            }
        }
        //小于等于9点
        if (currentHour <9) {
            if (num>0){
                //增加天(算今天)
                futureTime = DateUtil.offsetDay(currentTime, num);
                futureTime = DateUtil.beginOfDay(futureTime);
            }else {
                futureTime = DateUtil.beginOfDay(currentTime);
            }
            futureTime = DateUtil.offsetHour(futureTime, 9);
            if (num>0){
                futureTime = DateUtil.offsetMinute(futureTime, numMinute-num*workTimeMinuteEverDay);
            }else{
                //不足一天不用计算差值
                futureTime = DateUtil.offsetMinute(futureTime, numMinute);
            }
        }
        if(currentHour >=9&&currentHour<18){
            //计算当前时间距离18点还有多少分钟
            Date date = DateUtil.beginOfDay(currentTime);
            Date eighteenOClock = DateUtil.offsetHour(date, 18);
            int timeDiff = (int)DateUtil.between(eighteenOClock, currentTime, DateUnit.MINUTE);
            if (num>0){
                //减去当天的有效时间
                int numExceptToday=numMinute-timeDiff;
                int num2=numExceptToday/workTimeMinuteEverDay;
                //增加天(不算今天)
                futureTime = DateUtil.offsetDay(currentTime, num2+1);
                futureTime = DateUtil.beginOfDay(futureTime);
                futureTime = DateUtil.offsetHour(futureTime, 9);
                if (num2>0){
                    //计算差
                    futureTime = DateUtil.offsetMinute(futureTime, numExceptToday-num2*workTimeMinuteEverDay);
                }else {
                    //计算差
                    futureTime = DateUtil.offsetMinute(futureTime, numExceptToday);
                }

            }else {
                //偏移时间正好在当天工作时间内
                if (numMinute<=timeDiff){
                    //直接获取多少分钟后的时间
                    futureTime = DateUtil.offsetMinute(currentTime, numMinute);
                }else {
                    //偏移时间延后第二天9点开始计算
                    //增加天(不算今天)
                    futureTime = DateUtil.offsetDay(currentTime, 1);
                    futureTime = DateUtil.beginOfDay(futureTime);
                    futureTime = DateUtil.offsetHour(futureTime, 9);
                    futureTime = DateUtil.offsetMinute(futureTime, numMinute-timeDiff);
                }
            }
        }
        System.out.println(numMinute+"分钟后的时间是:" + DateUtil.formatDateTime(futureTime));
        return futureTime;
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要根据传入的时间和增加的小时数(n),从工作日历中获取新的时间,你可以按照以下步骤进行操作: 1. 首先,创建一个工作日历,包含工作日和工作日的定义。你可以使用一个预定义的工作日历,或者从数据库或API中获取相关数据来进行定义。 2. 接下来,使用一个循环来增加小时数(n)到给定的时间,同时在每次增加小时之前检查该时间是否是工作日。如果是工作日,则跳过时间并继续增加下一个小时。 3. 最后,返回计算后的时间。 下面是一个简单的示例代码,用于说明这个过程: ```java import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; public class SkipNonWorkingDays { public static void main(String[] args) { LocalDateTime startTime = LocalDateTime.now(); // 传入的时间 int hoursToAdd = 5; // 增加的小时数 LocalDateTime newTime = skipNonWorkingDays(startTime, hoursToAdd); System.out.println("新时间: " + newTime); } public static LocalDateTime skipNonWorkingDays(LocalDateTime startTime, int hoursToAdd) { LocalDateTime newTime = startTime; int addedHours = 0; while (addedHours < hoursToAdd) { newTime = newTime.plusHours(1); // 检查新时间是否是工作日 if (isWorkingDay(newTime)) { addedHours++; } } return newTime; } public static boolean isWorkingDay(LocalDateTime dateTime) { DayOfWeek dayOfWeek = dateTime.getDayOfWeek(); // 根据星期几判断是否为工作日 return dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY; } } ``` 请注意,这只是一个简单的示例代码,你需要根据你的实际需求进行适当的修改和扩展。例如,你可以根据具体的工作日历定义来判断工作日,或者使用更复杂的算法来处理跳过时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Herbig

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值