Java 计算工作时间 除去周末、节假日

这篇博客探讨了如何在Java中计算两个时间之间的实际工作小时数,考虑到排除周末和法定节假日。作者提供了需求背景,源码,并且提到了测试代码。这是一个初学者的分享,欢迎读者提出意见和建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

1、给定两个时间 计算两个时间之间的工作小时数.
2、给出一个开始时间startDate,计算其加上x小时之后的时间.
(只考虑到了分钟,秒不计)

前提:

1、节假日及周末日期存放在数据库

源码:


public class CalculateHoursUtil {
   
   
	
	//设置上班时间:该处时间可以根据实际情况进行调整
	static float morningBegin = 9;//上午上班时间,小时
	static float morningEnd = 12.5f;//上午下班时间,小时
	static float eveningBegin = 14;//下午上班时间,小时
	static float eveningEnd = 18;//下午下班时间,小时

	static float noonBreak = eveningBegin-morningEnd;//中午休息时间
	static float eveningBreak = 24-eveningEnd+morningBegin;//晚上休息时间
	static float morningWork = morningEnd-morningBegin;//上午上班时间
	static float eveningWork = eveningEnd-eveningBegin;//下午上班时间
	static float operHours = morningWork + eveningWork;//一天上班时间
	

	
    @SuppressWarnings("deprecation")
	public static String findHours(List<HolidayTable> maps,String startDate,float time) {
   
   
		//用于格式化日期
		Date startTime =  TimeUtils.formatDate(startDate, "yyyy-MM-dd HH:mm:ss");
		Date endTime = null;
		//从数据库得到节假日的日期
	    //从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1
	    Date flag = startTime;//设置循环开始日期
	    
	    Calendar cal = Calendar.getInstance();

	    cal.setTime(flag);
	    outer:while(time/operHours >= 1) {
   
   
	        for (HolidayTable map : maps){
   
   
	            if((TimeUtils.formatDate(TimeUtils.formatDate(flag),"yyyy-MM-dd")).compareTo(map.getHoliday()) == 0){
   
   
	            	//跳出循环进入下一个日期
	            	cal.add(Calendar.DAY_OF_MONTH, +1);
	                flag = cal.getTime();
	                continue outer;
	            }
	        }
	        //日期往后加一天
	        cal.add(Calendar.DAY_OF_MONTH, +1);
	        flag = cal.getTime();
	        time = time-operHours;
	    }
	    

	    float startHours = flag.getHours() + (float)flag.getMinutes()/60;
	    Date start =  TimeUtils.formatDate(TimeUtils.formatDate(flag),"yyyy-MM-dd");
    	cal.setTime(start);

	    //时间在上午上班之前
	    if(startHours <= morningBegin) {
   
   
    		if((time + morningBegin) <= morningEnd) {
   
   
	    		time = time + morningBegin ;
	    	} else if((time + morningBegin + noonBreak) <= eveningEnd) {
   
   
	    		time = time + morningBegin + noonBreak;
	    	} else {
   
   
	    		if((time + morningBegin + noonBreak + eveningBreak) <= morningEnd + 24) {
   
   
	    			time = time + morningBegin + noonBreak + eveningBreak;
	    		} else {
   
   
	    			time = time + morningBegin + noonBreak 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值