在php中计算不同的加班时间段


Calculating different bands of overtime in 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工作了一个小时,它就不起作用。

我有兴趣找到其他方法来做这件事。

您需要更准确地存储数据。从你的脚本来看,你似乎只是在节省开始时间——这很可能是一个完整的数字(1,2,3,4)

但是,您的脚本需要一个精确的时间表示。当然有很多方法可以做到这一点,但为了更好的脚本(稍后您可以使用其中一些更精确的值),我建议您将其存储为UNIX时间戳,然后获取时间戳的小时数:

$startingHour = date('H' $timeStampStored)

并检查它是否在你的任何"奖金"部分。如果用户在6:30开始工作,则该值将保持为6。

这段代码完全出乎我的意料,没有经过测试等等。它是作为一种方法的建议,而不是作为一个健壮的工作代码示例。它使用整数而不是日期,依赖于按顺序输入的数组数据等,甚至可能不会运行。

基本思想是为每个级别的加班乘数以及数组中非加班工资的小时数设置刻度,然后在该数组中循环,检查在输入的时间之间每一级别的加班工作了多少小时,同时跟踪可计费的总小时数值。

$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;

如果你想从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);