我正在开发一个简单的系统,这样我们的员工就可以节省他们的加班时间,因此,在月底,他们会为这些额外的工作时间付出代价。
正常时间计为1,但每晚(23:00至07:00)应为每小时1.25小时。
那就是说,我们要求介绍当天,开始和结束时间。所以,我以为我可以有这样的数组:
$hours= array(
'0' => true, '1' => true, '2' => true, '3' => true, '4' => true, '5' => true, '6' => true,
'7' => false, '8' => false, '9' => false, '10' => false, '11' => false, '12' => false, '13' => false,
'14' => false, '15' => false, '16' => false, '17' => false, '18' => false, '19' => false, '20' => false,
'21' => false, '22' => false, '23' => true
);
所以,基本上我测试一小时是特殊的还是没有像这样的循环:
$normals = 0;
$specials = 0;
$hour_since = '23:00:00';
$hour_since_expl = explode(':',$hour_since);
$hour_to = '23:15:00';
$hour_to_expl= explode(':',$hour_to );
$date = $fecha = '2012-03-14';
$datetime_since= strtotime($date ." ".$hour_since );
$datetime_to= ((int) $hour_to_expl[0] > (int) $hour_to_expl[0]) ?
strtotime(date("Y-m-d h:i:s", strtotime($date ." ".$hour_to)) . " +1 day") :
strtotime($date." ".$hour_to);
$difference = $datetime_to - $datetime_since;
$hours_difference = $difference / SECONDS_PER_HOUR; //60*60
for ($i = 0; $i <= $difference; $i++){
$hour = $i + (int) $hour_since_expl [0];
if ($hours[$hour]) //Special hour here... Pay more!
$specials++;
else
$normals++;
}
但问题是,当时间不准确,你已经开始了22:30这样的地方,结束了00:30,你有0.5小时并不特别。我一直在苦苦思索,但我找不到任何解决方案。
有人有任何想法吗?
修改:提供更多代码。
答案 0 :(得分:1)
编辑:花了一点时间,但我喜欢有趣的挑战;我希望它有所帮助!
$specialStart = 23;
$specialEnd = 7;
$normals = 0;
$specials = 0;
$hour_since = '22:00:00';
$hour_since_expl = explode(':',$hour_since);
$start_time = mktime($hour_since_expl[0], $hour_since_expl[1], $hour_since_expl[2]);
$hour_to = '07:30:00';
$hour_to_expl= explode(':',$hour_to );
$end_time = mktime($hour_to_expl[0], $hour_to_expl[1], $hour_to_expl[2]);
if($end_time < $start_time){
//worked passed minight, add a day
$end_time = $end_time + 86400;
}
$work_time = ( $end_time - $start_time ) / 60;
for($i = 0; $i < $work_time; $i++){
$time = $start_time + ( $i * 60 );
$hour_of_day = date("H", $time);
if($hour_of_day >= $specialStart || $hour_of_day < $specialEnd){
$specials += 60;
}else{
$normals += 60;
}
}
$specials = $specials / 3600;
$normals = $normals / 3600;
echo "specials: ".$specials;
echo "<br/>normals: ".$normals;
答案 1 :(得分:1)
假设开始时间是15:15,结束时间是22:45。首先,在它之前或之后将开始时间转换为最接近的HOUR,将结束时间转换为最接近的HOUR。所以我们得到15:00和22:00。在这些时间内使用你的循环,并使用如下差异:如果差异时间(15:15-15:00或22:45-22:00)是加班,那么加班* numMins / 60否则做标准* numMins / 60。我不熟悉PHP,所以必须在伪代码中执行此操作
答案 2 :(得分:0)
我建议你计算两个不同领域的总时间。首先得到正常时间,即23:00之前,然后是特殊时间,即23:00之后和07:00之前。
然后你可以轻松计算工资。