在php中计算不同的加班带

时间:2013-12-10 15:05:28

标签: php

这是我第一次在这里发帖,所以如果我出错了,我很抱歉。我试图根据他们登录的时间来计算一名工人加班的时间。问题是我们有不同的加班带:

  • 如果工人在5到7之间工作,则每小时额外增加25%
  • 如果他们在晚上7点到晚上10点之间工作,那么每小时50%的工作时间
  • 如果工人在10到12之间工作,则额外增加75%
  • 如果工人在上午12点到早上7点之间工作是100%以上

我需要计算他们在每个加班乐队工作了多少小时

$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工作了一小时,它就无法工作。

我有兴趣找到其他方法来做到这一点。

3 个答案:

答案 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);