这是我第一次在这里发帖,所以如果我出错了,我很抱歉。我试图根据他们登录的时间来计算一名工人加班的时间。问题是我们有不同的加班带:
我需要计算他们在每个加班乐队工作了多少小时
$number_of_25_percent_hours=0;
$number_of_50_percent_hours=0;
$number_of_75_percent_hours=0;
$number_of_100_percent_hours=0;
$clockInTime=$arr['4'];
$clockOutTime=$arr['5'];
$startingPieces=explode(':',$clockInTime);
$startingHour=$startingPieces[0];
$finishingPieces=explode(':',$clockInTime);
$finishingHour=$finishingPieces[0];
//Regular hours are between 7am and and 5pm
//If the worker works between 5 and 7 then it's 25% extra per hour
if(($startingHour<=5)&&($finishingHour>=6)){$number_of_25_percent_hours++;}
if(($startingHour<=6)&&($finishingHour>=7)){$number_of_25_percent_hours++;}
使用上述行的问题是,如果他们从6:30到7:30工作了一小时,它就无法工作。
我有兴趣找到其他方法来做到这一点。
答案 0 :(得分:0)
您需要更准确地存储数据。从你的脚本看起来好像你只保存起始小时 - 可能是一个完整的数字(1,2,3,4无论如何)
然而,您的脚本需要精确的时间表示。肯定有很多方法可以做到这一点,但是为了更好的脚本(并且因为您可以在以后使用这些更精确的值),我建议您将其存储为UNIX时间戳,然后获取时间戳的小时:
$startingHour = date('H' $timeStampStored)
并检查它是否在您的任何“奖励”细分中。如果用户在6:30开始工作,则该值将保持为6。
答案 1 :(得分:0)
这段代码完全脱离了我的头脑,未经测试等。它的目的是建议您可以使用一种方法来解决问题,而不是作为工作代码的强大示例。它使用整数而不是日期,依赖于按顺序输入的数组数据等,甚至可能不会运行。
基本思路是为每个级别的加班乘数设置比例,以及在阵列中非加班费的小时数,然后循环查看该阵列,检查每个加班级别的工作时数在输入的时间之间,同时跟踪总的可计费小时值。
$PayMultipliers = array();
$PayMultipliers[0] = array(17,19,1.25);
$PayMultipliers[1] = array(19,22,1.5);
$PayMultipliers[2] = array(22,24,1.75);
$PayMultipliers[3] = array(0,7,1.5);
$PayMultipliers[4] = array(7, 17, 1);
$Start = 3;
$End = 11;
$TotalHours = 0;
for($i = 0; $i <= count($PayMultipliers); $i++)
{
if($Start > $PayMultipliers[$i][0] && $Start < $PayMultipliers[$i][1])
{
$TotalHours += ($PayMultipliers[$i][1] - $Start) * $PayMultipliers[$i][2];
$Start = $PayMultipliers[$i][1];
}
}
echo $TotalHours;
答案 2 :(得分:0)
如果您想在6:30到7:30之间计算,您需要在几分钟内完成计算,而不是几小时。您可以将小时和分钟转换为时间戳,检查每个时间段,然后将秒转换回小时。
<?php
$number_of_overtime_hours = array();
$clockInTime = "18:30:00";
$clockOutTime = "19:30:00";
$startingPieces = explode(':',$clockInTime);
$finishingPieces = explode(':',$clockOutTime);
//Timestamps
$startTimestamp = mktime($startingPieces[0],$startingPieces[1],$startingPieces[2]);
$finishTimestamp = mktime($finishingPieces[0],$finishingPieces[1],$finishingPieces[2]);
//finish after 0h
if ($finishTimestamp < $startTimestamp){
$finishTimestamp += 3600 * 24;
}
//set starting and ending points
$overtimePeriods = array(
25 => array (17,19),
50 => array (19,22),
75 => array (22,24),
100 => array (24,31)
);
$overtimeWork = array();
foreach ($overtimePeriods as $key => $val){
//create Timestamps for overtime periods
$beginTimestamp = mktime($val[0],0,0);
$endTimestamp = mktime($val[1],0,0);
//calculate hours inside the given period
$overtimeWork[$key] = (min($finishTimestamp,$endTimestamp) - max($startTimestamp,$beginTimestamp)) / 3600;
//negative values mean zero work in this period
if ($overtimeWork[$key] < 0) $overtimeWork[$key] = 0;
}
var_dump($overtimeWork);