Laravel从给定的时间范围内删除时间块

开发人员

我正在努力 Laravel 5.2

根据项目要求,我的时间范围是从08:00 AM08:00 PM

IE array ("start"=> "08:00:00", "end" => "20:00:00");

那里有几个休息时间,例如01:00 PMto 02:00 PM04:00 PMto 04:30 PM06:35 PMto 07:10 PM06:45 PMto07:15 PM等。

IE

array(
["start" => "13:00:00", "end" => "14:00:00"], 
["start" => "16:00:00", "end" => "16:30:00"],
["start" => "18:35:00", "end" => "19:10:00"],
["start" => "18:45:00", "end" => "19:15:00"],
);

现在,我想从给定范围中删除所有这些休息时间块,并希望将结果放入数组中,

array (
["start" => "08:00 AM", "end" => "01:00 PM"],
["start" => "01:00 PM", "end" => "04:00 PM"],
["start" => "04:30 PM", "end" => "06:35 PM"], 
["start" => "07:15 PM", "end" => "08:00 PM"]
)

使用PHPLaravel如何实现?

blablabla

我手上有一些时间。试试这个。

function amPmToDateTime($ampm)
{
    return DateTime::createFromFormat('Y-m-d h:i A', "1000-01-01 {$ampm}");
}

function timeToDateTime($time)
{
    return DateTime::createFromFormat('Y-m-d H:i:s', "1000-01-01 {$time}");
}

function formatAmPm(DateTime $dateTime)
{
    return $dateTime->format("h:i A");
}

function formatTime(DateTime $dateTime)
{
    return $dateTime->format("H:i:s");
}

function intervalsCollide($i1, $i2) {
    if( !(($i1[1] <= $i2[0] && $i1[1] < $i2[1]) || ($i1[0] > $i2[0] && $i1[0] >= $i2[1])) ) {
        return true;
    }
    return false;
}

function intervalMinusBreak($interval, $break)
{
    $intervalParts = [];

    if( intervalsCollide($interval, $break) )
    {
        if( $interval[0] < $break[0] && $interval[1] > $break[1] )
        {
            $intervalParts[] = [ $interval[0], $break[0] ];
            $intervalParts[] = [ $break[1], $interval[1] ];
        } 
        else if( $interval[0] < $break[0] && $interval[1] <= $break[1] )
        {
            $intervalParts[] = [ $interval[0], $break[0] ];
        }
        else if( $interval[0] >= $break[0] && $interval[1] > $break[1] )
        {
            $intervalParts[] = [ $break[1], $interval[1] ];
        }
    }
    else
    {
        $intervalParts[] = $interval;
    }

    return $intervalParts;
}

function intervalMinusBreaks($interval, $breaks)
{
    $break = array_pop($breaks);
    $parts = intervalMinusBreak($interval, $break);

    if( count($breaks) < 1 )
    {
        return $parts;
    }

    $intervalParts = [];

    foreach($parts as $part)
    {
        $intervalParts = array_merge($intervalParts, intervalMinusBreaks($part, $breaks));
    }

    return $intervalParts;
}

$interval = [ "start" => "08:00:00", "end" => "20:00:00" ];
$interval = [ timeToDateTime($interval['start']), timeToDateTime($interval['end']) ];


$breaks = [
    ["start" => "13:00:00", "end" => "14:00:00"], 
    ["start" => "16:00:00", "end" => "16:30:00"],
    ["start" => "18:35:00", "end" => "19:10:00"],
    ["start" => "18:45:00", "end" => "19:15:00"],
];

$breaks = array_map(function($break) {
    return [ timeToDateTime($break['start']), timeToDateTime($break['end']) ];
}, $breaks);

$timeBlocks = intervalMinusBreaks($interval, $breaks);

$timeBlocks = array_map(function($timeBlock) {
    return [ 'start' => formatAmPm($timeBlock[0]), 'end' => formatAmPm($timeBlock[1]) ];
}, $timeBlocks);

echo "<pre>";
print_r($timeBlocks);
echo "</pre>";

结果:

Array
(
    [0] => Array
        (
            [start] => 08:00 AM
            [end] => 01:00 PM
        )

    [1] => Array
        (
            [start] => 02:00 PM
            [end] => 04:00 PM
        )

    [2] => Array
        (
            [start] => 04:30 PM
            [end] => 06:35 PM
        )

    [3] => Array
        (
            [start] => 07:15 PM
            [end] => 08:00 PM
        )

)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

查找在给定时间范围内修改的文件

来自分类Dev

给定时间范围内事件的大概计数

来自分类Dev

在给定的时间范围内清除每个通知javascript

来自分类Dev

在时间范围内循环

来自分类Dev

SQLite在特定时间范围内删除重复项

来自分类Dev

在特定时间范围内删除文件

来自分类Dev

计算时间范围内的时间

来自分类Dev

检查时间(带时区)是否在给定的时间范围内

来自分类Dev

给定日期时间范围内的随机日期时间

来自分类Dev

计算给定时间范围内两个日期时间之间的小时数

来自分类Dev

给定日期时间范围内的随机日期时间

来自分类Dev

从给定的开始结束时间计算每小时时间范围内的发生次数

来自分类常见问题

如何检查给定的小时和分钟(整数)是否在给定的时间范围内?

来自分类Dev

查询以获取给定时间范围内具有给定状态的项目数

来自分类Dev

比较时间:检查给定时间是否在另一个时间范围内

来自分类Dev

比较时间:检查给定时间是否在另一个时间范围内

来自分类Dev

检索给定月份内每天时间范围内的记录

来自分类Dev

检索给定月份内每天时间范围内的记录

来自分类Dev

其他时间范围内的MySQL时间范围

来自分类Dev

使用Redis计算给定时间范围内的共现次数

来自分类Dev

收集API-PHP-跟踪给定时间范围内的总小时数

来自分类Dev

在固定间隔后如何运行骆驼计时器,但仅在给定的时间范围内

来自分类Dev

芹菜仅在给定时间范围内运行任务

来自分类Dev

如何在Django中显示给定时间范围内的数据?

来自分类Dev

计算在给定时间范围内落入间隔的每个“ x”?

来自分类Dev

熊猫sort_index仅在给定的时间范围内

来自分类Dev

SQL 2008-我需要计算给定时间范围内每位员工的行数

来自分类Dev

解析查询以打印给定时间范围内的所有结果

来自分类Dev

在给定的小时间隔范围内,从邮件列表生成文本文件

Related 相关文章

  1. 1

    查找在给定时间范围内修改的文件

  2. 2

    给定时间范围内事件的大概计数

  3. 3

    在给定的时间范围内清除每个通知javascript

  4. 4

    在时间范围内循环

  5. 5

    SQLite在特定时间范围内删除重复项

  6. 6

    在特定时间范围内删除文件

  7. 7

    计算时间范围内的时间

  8. 8

    检查时间(带时区)是否在给定的时间范围内

  9. 9

    给定日期时间范围内的随机日期时间

  10. 10

    计算给定时间范围内两个日期时间之间的小时数

  11. 11

    给定日期时间范围内的随机日期时间

  12. 12

    从给定的开始结束时间计算每小时时间范围内的发生次数

  13. 13

    如何检查给定的小时和分钟(整数)是否在给定的时间范围内?

  14. 14

    查询以获取给定时间范围内具有给定状态的项目数

  15. 15

    比较时间:检查给定时间是否在另一个时间范围内

  16. 16

    比较时间:检查给定时间是否在另一个时间范围内

  17. 17

    检索给定月份内每天时间范围内的记录

  18. 18

    检索给定月份内每天时间范围内的记录

  19. 19

    其他时间范围内的MySQL时间范围

  20. 20

    使用Redis计算给定时间范围内的共现次数

  21. 21

    收集API-PHP-跟踪给定时间范围内的总小时数

  22. 22

    在固定间隔后如何运行骆驼计时器,但仅在给定的时间范围内

  23. 23

    芹菜仅在给定时间范围内运行任务

  24. 24

    如何在Django中显示给定时间范围内的数据?

  25. 25

    计算在给定时间范围内落入间隔的每个“ x”?

  26. 26

    熊猫sort_index仅在给定的时间范围内

  27. 27

    SQL 2008-我需要计算给定时间范围内每位员工的行数

  28. 28

    解析查询以打印给定时间范围内的所有结果

  29. 29

    在给定的小时间隔范围内,从邮件列表生成文本文件

热门标签

归档