计算一个时间段内应工作多少小时

海先生 发布于 2014/07/29 16:58
阅读 346
收藏 0
例如:

 2014-09-25 10:30   ------   2014-09-29 20:30 ;

 工作日作息: 9:00-12:00, 13:00-18:00;

 计算出这个时间区间里应工作多少小时

加载中
0
饶飞成
饶飞成
这种逻辑还是自己动动脑子写吧!
海先生
海先生
我想着有些复杂啊
0
尛海贼
尛海贼
度娘有“工作日计算器”,然后再乘以每天8小时就行了
海先生
海先生
强大!这个呢,主要是请假用,随便设置两个时间,算出实际请假多久
0
jeffsui
jeffsui
不算加班吗?
海先生
海先生
请假用,计算实际请假多久
0
工兵铲
工兵铲
虽然繁琐了点.但逻辑没啥难度啊...中规中矩的算就是了呗
0
皮蛋猫
皮蛋猫
package com.test;

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

import org.apache.commons.lang.time.DateUtils;

public class WorkingDay {

	public static void main(String[] s) throws ParseException {
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd");        
		String bDate = "2014-07-25"; 
		String eDate = "2014-07-29"; 
		Date beginDate = format.parse(bDate); //开始时间
		Date endDate = format.parse(eDate); //结束时间
		Date nowDate = beginDate;
		Boolean validate =Boolean.FALSE;//如果大于了则代表已经超过结束时间
		int workingDay = 0;
		while(!validate){
			if(!isWeekend(nowDate)){ //判断当前值是否是否是非周日,还有是否非法定假期
				workingDay++;
			}
			nowDate = DateUtils.addDays(nowDate, 1);//
			validate = nowDate.after(endDate);
		}
		System.out.print("工作日:"+workingDay*8+"小时");
		
	}

	/**
	 * 判断是否周日
	 * @param weekend
	 * @return
	 */
	public static boolean isWeekend(Date weekend) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(weekend);
		if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
				|| cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
			return Boolean.TRUE;
		}
		return Boolean.FALSE;
	}

}

大概写了一个简单的,应该有其他更加单的方式,如果你觉得有用可以参照(还没有运行,有可能会有错哟)。

如果不算加班,只需要算工作日则需要排除周末还有国家法定假日(比如国庆,中秋这些)

至于国家法定假日这种日期是不固定的,你可以通过数据库或者配置文件的方式来记录下法定假日,然后在循环中判断一下。

对于开始时间和结束时间中包含有小时,这里你需要再修改一下




皮蛋猫
皮蛋猫
回复 @Dieselz : 你可以补上嘛。少年
海先生
海先生
思路很清晰,还差个 ‘ 时:分 ’
0
海先生
海先生
protected function test(){
		$b = '2014-07-31 10:30';
		$e = '2014-08-04 16:45';

		$bDate = substr($b,0,10);
		$eDate = substr($e,0,10);

		// begin hour minute
		$bhm = preg_replace("/:/",'.',substr($b,11,5));
		$bsub = 0;
		if($bhm > 9 && $bhm <= 12){
			$bsub = $bhm - 9;
		}elseif($bhm > 12 && $bhm <=13){
			$bsub = 3;
		}elseif($bhm > 13 && $bhm <= 18){
			$bsub = $bhm - 13 + 3;
		}else{
			$bsub = 8;
		}
		
		$tmp = explode('.',$bsub);
		$bsubh = intval(isset($tmp[0])?$tmp[0]:0);
		$bsubm = intval(isset($tmp[1])?$tmp[1]:0);
		$bsubm < 10 && $bsubm *= 10;
		// begin minutes
		$bm = $bsubh * 60 + $bsubm;

		// end hour minute
		$ehm = preg_replace("/:/",'.',substr($e,11,5));
		$esub = 0;
		if($ehm > 9 && $ehm <= 12){
			$esub = $ehm - 9;
		}elseif($ehm > 12 && $ehm <=13){
			$esub = 3;
		}elseif($ehm > 13 && $ehm <= 18){
			$esub = $ehm - 13 + 3;
		}else{
			$esub = 8;
		}

		$tmp = explode('.',$esub);
		$esubh = intval(isset($tmp[0])?$tmp[0]:0);
		$esubm = intval(isset($tmp[1])?$tmp[1]:0);
		$esubm < 10 && $esubm *= 10;
		// end minutes
		$em = 60 * 8 - ($esubh * 60 + $esubm);

		// total days
		$days = (strtotime($eDate) - strtotime($bDate))/86400 + 1;

		// total weekend
		$countWeek = 0;
		for($i=strtotime($bDate),$j=strtotime($eDate);$i<=$j;$i+=86400){
			$week = date('w',$i);
			($week == 0 || $week == 6) && $countWeek++;
		}

		// total hours
		$hc = $days * 8 - $bm/60 - $em/60 - $countWeek * 8;

		return $hc;
	}

早上刚写的,还没有加入节假日

返回顶部
顶部