分段(白天,夜晚等)打破时间段(轮班)

时间:2014-07-17 17:47:29

标签: php algorithm time timespan

我在PHP的小项目中遇到问题,并且无法考虑考虑每种情况的算法。该问题为文件提供了两个常量和一个信息数组。

<?php


// The start and end of nighttime hours
$SETTINGS_nighttime_start = '22:00';
$SETTINGS_nighttime_end   = '07:00';

// Employees and their shifts
$EMPLOYEES = array(

    '0' => array(
        'name'        => 'Bernice Lyons',
        'shift_start' => '15:15',
        'shift_end'   => '23:45'
    ),

    '1' => array(
        'name'        => 'Gregg Santos',
        'shift_start' => '10:00',
        'shift_end'   => '22:00'
    ),

    '2' => array(
        'name'        => 'Bennie Montgomery',
        'shift_start' => '22:30',
        'shift_end'   => '08:00'
    ),

    '3' => array(
        'name'        => 'Nelson Austin',
        'shift_start' => '20:00',
        'shift_end'   => '10:00'
    ),

    '4' => array(
        'name'        => 'Garrett Sims',
        'shift_start' => '09:00',
        'shift_end'   => '17:00'
    ),

    '5' => array(
        'name'        => 'Joanna Pratt',
        'shift_start' => '23:00',
        'shift_end'   => '06:00'
    )

);

&GT;

因此,我需要编写一个算法来考虑每个案例,并计算某人每天工作和晚上工作的时间。

我应该用什么声明来报道案件并获得正确的结果:

startShift = 20:00
endShift = 10:00

应该结果

daytimeWork = 05:00
nighttimeWork = 09:00

我到目前为止得到了数据并在屏幕上打印,但我在计算白天和夜间班次时遇到问题

我写的这个案例的伪代码是

if(startShift<22:00 && endShift>07:00){
   nighttimeWork = 09:00;
   daytimeWork = shiftLength - 09:00;
}

但声明中包含案例

startShift = 10:00
endShift = 20:00

我很沮丧。请有人帮忙。

2 个答案:

答案 0 :(得分:2)

此问题要求您从班次开始:时间间隔由开始/结束时间表示。它要求你将这些转变分解为shiftlets:较小的非重叠时间间隔,其结合跨越相同的开始/结束时间。

考虑一个软件操作,它将一个移位项目作为输入,并将其分解为shiftlets。

例如:

startShift = 20:00  endShift = 10:00

首先打破这种转变为不会跨越午夜的小穗:

startShift = 20:00  endShift = 00:00
startShift = 00:00  endShift = 10:00

然后将这些叛徒分成不穿越白天/黑夜边界的小手。

startShift = 20:00  endShift = 00:00
startShift = 00:00  endShift = 07:00
startShift = 07:00  endShift = 10:00

然后在白天或晚上对每个小琵琶进行分类,然后加起来,你就完成了。

答案 1 :(得分:0)

所以我结束了编写一个不知道是否有效的算法,但认为它适用于表格的给定时间和其他所有情况

if(startTime <22:00 && endTime>=07:00{
   if(startTime > endTime){
      nightShift = 09:00; //From 22:00 - 07:00
      dayShift = shiftLength - 09:00 //What left is daytime
   }
   else if(startTime < endTime){
      if(endTime >22:00){//if endTime is for example 23:00
        nightTime = endTime - 22:00;
        dayTime = shiftLength - nightTime;
      else{
         if(startTime<07:00){
            nightTime = 07:00 - startTime;
            dayTime = shiftLength - nightTime;
         }
         else{     
         dayTime = shiftLength; //all hours should be day
         nightTime = 0;
         }
      }
   }
 elseif(startTime>=22:00){
    if(endTime>07:00){
       nightTime = 24 - (startTime - 07:00); //from start time i.e 23:00 to 06:00
       dayTime = shiftLength - nightTime; 
    if(endTime<=07:00){
       nightTime = shiftLength; //worked all night
       dayTime = 0;
}
//This elseif not need for the given values but covers the case i.e from 17:00 to 03:00
//and start after 00:00 and ending before 07:00
elseif(startTime<22:00 && endTime<=07:00){
      if(startTime<07:00){
         nightShift = shiftLength;
         dayShift = 0;
      }
      else{
         dayTime = 22:00 - startTime;
         nightTime = shiftLength - dayTime;
      }
}