doujilou3903
2010-12-27 07:49
浏览 67
已采纳

Php - 将时间段划分为相等的间隔

I have to create a function which gets 5 parameters representing information about the working time of some department.
- when the work starts/ends,
- when the lunchtime (or any other break) starts/ends,
- integer representing minutes into how small pieces we should divide time period.

Besides - it's possible that there are no breaks in the working time.

The function should return all intervals from working time.

function split_time_into_intervals($work_starts,$work_ends,$break_starts=null;
          $break_ends=null,$minutes_per_interval=60)
{
    $intervals=array();

    //all of the function code
    return $intervals;
}

So if I have the following parameters for the function

function split_time_into_intervals("8:30","14:50","11:45", "12:25");

I would like to retrieve the following array:

$intervals[0]['starts']="8:30";
$intervals[0]['ends']="9:30";
$intervals[1]['starts']="9:30";
$intervals[1]['ends']="10:30";
$intervals[2]['starts']="10:30";
$intervals[2]['ends']="11:30";
$intervals[3]['starts']="11:30";
$intervals[3]['ends']="11:45";

//this interval was smaller than 60 minutes - because of the break (which starts at 11:45)
$intervals[4]['starts']="12:25";//starts when the break ends
$intervals[4]['ends']="13:25"; // interval is again 60 minutes
$intervals[5]['starts']="13:25";
$intervals[5]['ends']="14:25";
$intervals[6]['starts']="14:25";
$intervals[6]['ends']="14:50";

//this period is shorter than 60 minutes - because work ends 

Any advises? I would apriciate any php (or C#) code regarding to this problem!

图片转代码服务由CSDN问答提供 功能建议

我必须创建一个函数,该函数获取5个参数,表示某个部门的工作时间信息。
n-当工作开始/结束时,
-当午餐时间(或任何其他休息时间)开始/结束时,
-整数表示我们应该分割时间段的小部分的分钟数。

此外 - 工作时间可能没有中断。

该函数应该从工作时间返回所有间隔。

  function split_time_into_intervals($ work_starts,$ work_ends,$ break_starts = null; 
 $ break_ends = null,$ minutes_per_interval = 60)
 {
 $ interval = array(); 
  
 //所有函数代码
返回$ interval; 
} 
   
 
 

所以如果我有函数的以下参数 \ n

  function split_time_into_intervals(“8:30”,“14:50”,“11:45”,“12:25”); 
   
 
  n 

我想检索以下数组:

  $ interval [0] ['starts'] =“8:30”; 
 $ interval [0  ] [ '末端'] = “9:30”; 
 $的间隔[1] [ '开始'] =​​ “9:30”; 
 $的间隔[1] [ '末端'] = “10:30”  ; 
 $的间隔[2] [ '开始'] =​​ “10:30”; 
 $的间隔[2] [ '末端'] = “11:30”; 
 $的间隔[3] [ '开始'  ] =“11:30”; 
 $ interval [3] ['ends'] =“11:45”; 
 
 //此间隔小于60分钟 - 因为中断(从11开始)  :45)
 $间 vals [4] ['starts'] =“12:25”; //在休息结束时开始
 $ interval [4] ['ends'] =“13:25”;  //间隔是60分钟
 $ interval [5] ['starts'] =“13:25”; 
 $ interval [5] ['ends'] =“14:25”; 
 $ interval [  6] ['starts'] =“14:25”; 
 $ interval [6] ['ends'] =“14:50”; 
 
 //这段时间短于60分钟 - 因为工作结束 
   
 
 

有什么建议吗? 我会关于这个问题的任何PHP(或C#)代码!

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dongzhi7641 2010-12-27 13:03
    已采纳

    Finaly I solve my problem! Thanks, tharkun for interest! At this moment it works as I want it to! I suppose that in some cases this function might work with some bugs, so I would like to know if they show up. For now here are two functions. Sory, if it could be written shorter and more optimized, but at least it works!

    //Author: Elvijs Kukša
    function splitTimeIntoIntervals($work_starts,$work_ends,$break_starts=null,$break_ends=null,$minutes_per_interval=60){
    $intervals=array();
    $time = date("H:i",strtotime($work_starts));
    $first_after_break=false;
    while( strtotime($time) < strtotime($work_ends)){
    // if at least one of the arguments associated with breaks is mising - act like there is no break
        if($break_starts==null || $break_starts==null )
        {
        $time_starts=date("H:i", strtotime($time));
        $time_ends=date("H:i", strtotime($time_starts."+$minutes_per_interval minutes"));
        }
    // if the break start/end time is specified
        else{
        if($first_after_break==true){//first start time after break
        $time=(date("H:i",strtotime($break_ends)));
        $first_after_break=false;
        }
        $time_starts=(date("H:i",strtotime($time)));
        $time_ends=date("H:i", strtotime($time_starts."+$minutes_per_interval minutes"));
    //if end_time intersects break_start and break_end times
        if(timesIntersects($time_starts, $time_ends, $break_starts, $break_ends))
        {
        $time_ends=date("H:i",strtotime($break_starts));
        $first_after_break=true;
        }
        }
        //if end_time is after work_ends
        if(date("H:i", strtotime($time_ends))>date("H:i",strtotime($work_ends)))
        {
        $time_ends=date("H:i",strtotime($work_ends));
        }
        $intervals[] = array( 'starts' =>$time_starts, 'ends' => $time_ends);
        $time=$time_ends;
    }
    return $intervals;
    }
    //time intersects if order of parametrs is one of the following 1342 or 1324
    
    
    function timesIntersects($time1_from,$time1_till, $time2_from, $time2_till){
        $out;
        $time1_st=strtotime($time1_from);
        $time1_end=strtotime($time1_till);
        $time2_st=strtotime($time2_from);
        $time2_end=strtotime($time2_till);
        $duration1 =$time1_end - $time1_st;
        $duration2 = $time2_end - $time2_st;
        $time1_length=date("i",strtotime($time1_till."-$time1_from"));
        if(
                (($time1_st<=$time2_st&&$time2_st<=$time1_end&&$time1_end<=$time2_end)
                ||
                ($time1_st<=$time2_st&&$time2_st<=$time2_end&&$time2_end<=$time1_end)
                &&
                ($duration1>=$duration2)
                )
                ||
                ( $time1_st<=$time2_st&&$time2_st<=$time1_end&&$time1_end<=$time2_end)
                &&
                ($duration1<$duration2)
                )
        {
            return true;
        }
    
    
        return false;
    }
    
    已采纳该答案
    打赏 评论
  • dongluedeng1524 2010-12-27 08:01

    Well, this might be a bit uneffective, but you could try this (I didn't test it, and it might have some errors, but it should work something alike:

    $time = $work_starts;
    
    while($time < $work_ends)
    {
         if( ($break_starts !== null) && ($time + 60 <= $break_starts) )
         {
             $intervals[] = array( 'starts' => $time, 'ends' => ($time += 60) );
         }
         else if( $break_starts !== null ) 
         {
             $time = $break_ends;
         }
         else if( $time + 60 <= $work_ends )
         {
             $intervals[] = array( 'starts' => $time, 'ends' => ($time += 60) );
         }
     }
    

    of course, $time += 60 should be translated to actual minute adding. This is a pseudoalgorithm.

    Hope it helps

    打赏 评论

相关推荐 更多相似问题