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

发布于 2024-10-09 14:29:43 字数 1287 浏览 3 评论 0原文

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

此外,工作时间可能没有休息时间。

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

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

因此,如果我的函数有以下参数,

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

我想检索以下数组:

$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 

有什么建议吗?我会 apriciate 任何与此问题相关的 php(或 C#)代码!

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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心在旅行 2024-10-16 14:29:43

好吧,这可能有点无效,但你可以尝试这个(我没有测试它,它可能有一些错误,但它应该工作类似:

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

当然,$time += 60 应该翻译为实际的分钟添加,这是一个伪算法,

希望它有帮助。

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

北方的巷 2024-10-16 14:29:43

终于我解决了我的问题!谢谢塔昆的兴趣!
此刻它按照我想要的方式工作了!我想在某些情况下这个函数可能会出现一些错误,所以我想知道它们是否会出现。
现在有两个函数。抱歉,如果它可以写得更短、更优化,但至少它有效!

//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;
}

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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文