JAVA 计算两个日期之间的工作日的小时数

文章目录

前言

场景:公司业务人员在录入项目的时候,填写项目截止时间,如果截止时间小于工作日6小时,需要给出提示,防止预留时间不足,领导还没有批,项目就失效的情况。

代码展示

用到的工具包:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.6.5</version>
</dependency>

方法:

package com.sumec.controller.seo;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {


    public static void main(String[] args) throws ParseException {

        // 当前时间
        Date now = new Date();

        // 截止时间
        String line = "2022-06-03 18:30:30";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Date lineDate = sdf.parse(line);

        // 工作日时间8小时
        int workDayHours = 8;

        DateTime beginTime = DateTime.of(now);
        DateTime endTime = DateTime.of(lineDate);

        // 开始日期的上班时间和下班时间
        Date beginStartWork = sdf.parse(beginTime.toDateStr() + " 09:00:00");
        Date beginAfterWork = sdf.parse(beginTime.toDateStr() + " 18:00:00");

        // 截止日期的上班时间和下班时间
        Date endStartWork = sdf.parse(endTime.toDateStr() + " 09:00:00");
        Date endAfterWork = sdf.parse(endTime.toDateStr() + " 18:00:00");

        long totalWorkHours = 0;
        // 计算两个日期之间的天数差
        long daySub = DateUtil.between(DateUtil.truncate(now, DateField.DAY_OF_YEAR), DateUtil.truncate(lineDate, DateField.DAY_OF_YEAR), DateUnit.DAY, false);
        if (daySub > 1) {
            int weekendDays = 0;
            // 取两个日期的当天0点作为计算天,计算两个日期之间的周末的天数
            DateTime start = DateUtil.truncate(now, DateField.DAY_OF_YEAR);
            DateTime end = DateUtil.truncate(lineDate, DateField.DAY_OF_YEAR);
            while (DateUtil.between(start, end, DateUnit.DAY, false) > 1) {
                if (start.isWeekend()) {
                    weekendDays ++;
                }
                start = start.offset(DateField.DAY_OF_YEAR, 1);
            }
            // 计算两个日期之间的整工作日,排除前后两个日期
            long workDays = ( daySub - weekendDays - 2 ) < 0 ? 0 : ( daySub - weekendDays - 2 );
            totalWorkHours = workDays * workDayHours;
            // 计算前后两个工作日的工作小时数
            if (!beginTime.isWeekend()) {
                totalWorkHours += ( now.before(beginStartWork) ) ? 8 : ( now.after(beginAfterWork) ? 0 : DateUtil.between(beginTime, beginAfterWork, DateUnit.HOUR, false) );
            }
            if (!endTime.isWeekend()) {
                totalWorkHours += ( lineDate.before(endStartWork) ) ? 0 : ( lineDate.after(endAfterWork) ? 8 : DateUtil.between(endStartWork, lineDate, DateUnit.HOUR, false) );
            }
        }
        else if (daySub == 1) {
            // 计算前后两个工作日的工作小时数
            if (!beginTime.isWeekend()) {
                totalWorkHours += ( now.before(beginStartWork) ) ? 8 : ( now.after(beginAfterWork) ? 0 : DateUtil.between(beginTime, beginAfterWork, DateUnit.HOUR, false) );
            }
            if (!endTime.isWeekend()) {
                totalWorkHours += ( lineDate.before(endStartWork) ) ? 0 : ( lineDate.after(endAfterWork) ? 8 : DateUtil.between(endStartWork, lineDate, DateUnit.HOUR, false) );
            }
        }
        else {
            if (now.before(beginStartWork) && lineDate.after(beginAfterWork)) {
                totalWorkHours = 8;
            }
            else if (now.after(beginStartWork) && lineDate.after(beginAfterWork)) {
                totalWorkHours = DateUtil.between(now, beginAfterWork, DateUnit.HOUR, false);
            }
            else if (now.before(beginStartWork) && lineDate.before(beginAfterWork)) {
                totalWorkHours = DateUtil.between(beginStartWork, lineDate, DateUnit.HOUR, false);
            }
            else if (now.after(beginStartWork) && lineDate.before(beginAfterWork)) {
                totalWorkHours = DateUtil.between(now, lineDate, DateUnit.HOUR, false);
            }
        }

        System.out.println("当前时间[ " + beginTime + " ]到截止时间[ "+ endTime +" ]的工作日小时数:" + totalWorkHours);
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值