如何区分小时?

时间:2012-03-14 10:19:05

标签: php time

我正在开发一个简单的系统,这样我们的员工就可以节省他们的加班时间,因此,在月底,他们会为这些额外的工作时间付出代价。

正常时间计为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小时并不特别。我一直在苦苦思索,但我找不到任何解决方案。

有人有任何想法吗?

修改:提供更多代码。

3 个答案:

答案 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之前。

然后你可以轻松计算工资。