【问题标题】:Check if time interval does fall inside other time intervals检查时间间隔是否落在其他时间间隔内
【发布时间】:2021-06-30 20:01:46
【问题描述】:

我想确定给定的时间间隔是否不属于其他时间间隔(使用 24 小时制格式),示例如下:

案例1:

$startDate = '2021-04-05 08:05:00';
$endDate = '2021-04-05 10:05:00';

$intervals = [['startDate' => '2021-04-05 08:30:00', 'endDate' => '2021-04-05 11:05:00'], ['startDate' => '2021-04-05 12:30:00', 'endDate' => '2021-04-05 13:05:00']]

在这种情况下我们应该设置:

$flagCanSchedule = 0;

因为 2021-04-05 08:05:00 到 2021-04-05 10:05:00 介于此间隔之间:

'startDate' => '2021-04-05 08:30:00', 'endDate' => '2021-04-05 11:05:00'

但是对于这个: 案例2:

$startDate = '2021-04-05 08:05:00';
$endDate = '2021-04-05 10:05:00';

$intervals = [['startDate' => '2021-04-05 10:05:00', 'endDate' => '2021-04-05 11:05:00'], ['startDate' => '2021-04-05 07:30:00', 'endDate' => '2021-04-05 08:05:00']]

在这种情况下设置:

$flagCanSchedule = 1;

因为我们不重叠任何其他区间,所以 evan tho ('2021-04-05 08:05:00' == '2021-04-05 08:05:00')。

我想使用 strtotime 解决这个问题并将日期转换为 unix 格式,但我不确定如何编写我的 if 语句。

$startDate = strtotime('2021-04-05 08:05:00');
$endDate = strtotime('2021-04-05 10:05:00');
foreach($intervals as $interval) {
   if($startDate <= strtotime($interval['startDate']) && $endDate <= 
   strtotime($interval['endDate'])) {
       $flagCanSchedule = 1;
   } else {
       $flagCanSchedule = 0;
   }
}

【问题讨论】:

    标签: php date time strtotime


    【解决方案1】:

    当找到flagCanSchedule 时,您应该添加break。因为,下一次迭代会覆盖这个值(从10)。

    $intervals = [
        ['startDate' => '2021-04-05 10:05:00', 'endDate' => '2021-04-05 11:05:00'], 
        ['startDate' => '2021-04-05 07:30:00', 'endDate' => '2021-04-05 08:05:00'],
    ];
    
    $startDate = strtotime('2021-04-05 08:05:00');
    $endDate = strtotime('2021-04-05 10:05:00');
    foreach($intervals as $interval)
    {
       if ($startDate <= strtotime($interval['startDate']) && 
           $endDate <= strtotime($interval['endDate'])) 
       {
           $flagCanSchedule = 1;
           break; // << stop the test
       } 
       else {
           $flagCanSchedule = 0;
       }
    }
    var_dump($flagCanSchedule); // int(1)
    

    您也可以通过先初始化标志来删除else 语句。

    $flagCanSchedule = 0;
    foreach ($intervals as $interval) 
    {
       if ($startDate <= strtotime($interval['startDate']) && 
           $endDate <= strtotime($interval['endDate'])) 
       {
           $flagCanSchedule = 1;
           break;
       }
    }
    var_dump($flagCanSchedule); // int(1)
    

    【讨论】:

    • 这不适用于闲置情况 ['startDate' => '2021-04-05 08:06:00', 'endDate' => '2021-04-05 11:00 :00'] 和 $startDate = strtotime('2021-04-05 08:05:00'); $endDate = strtotime('2021-04-05 10:05:00');它将重叠间隔!
    • 这也行不通,请在此处查看我编辑的示例:3v4l.org/bnB9R
    • 请注意,时间间隔可以是日期与时间的任意随机间隔。基本上是一个日程计算器,只有在有空闲日程时才应该输出 1。我上面的示例(在链接中)输出 1 evan tho 2021-04-05 10:05:00 将落在区间内。
    • updated。如果我理解,在情况 1 中,标志为 1,因为 $startDate 不在区间内。情况 2,flag 为 1,因为 $startDate en $endDate 不在区间内,情况 3,flag 为 0,因为 $startDate en $endDate 不在区间内?
    • 这不仅仅是关于 $startDate,让我们举一个实际的例子,你是一个工人,你在 '2021-04-05 08:05:00' 和 '2021-04-05 10' 之间工作: 05:00' 在某个地方,而其他人想在此时间间隔 '2021-04-05 08:06:00' 和 '2021-04-05 11:00:00' 之间安排另一个工作允许,因为您显然可以说在“2021-04-05 09:00:00”时,您仍被安排在此时间间隔的第一名:“2021-04-05 08:05:00”和“2021-04-05” 10:05:00'
    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多