【问题标题】:How to tell if a time range is within a time range? PHP [closed]如何判断时间范围是否在时间范围内? PHP [关闭]
【发布时间】:2012-12-17 16:39:54
【问题描述】:

我有 2 名员工在星期一的两个时间段工作。我想为我们的客户提供一种简单的方法来创建按一天中的各个部分(晚上、下午、早上)细分的约会。

- Morning: 0001 to 1200
- Afternoon: 1201 to 1600
- Evening: 1601 to 2400

周一至周五的日程安排
约翰工作:早上 7 点到下午 1 点
迈克尔工作:下午 1 点至晚上 7 点

星期六的时间表
约翰工作:上午 8 点到下午 12 点

Mon - Fri 应显示以下按钮:上午、下午和晚上。 星期六应该只显示“早上”按钮。

我不知道如何做到这一点,因为约翰的日程安排在下午结束。所以我正在研究如何检查一个时间范围是否在另一个时间范围内并返回一个布尔值或其他东西。


我试图将所有内容分解为开始和结束时间块,我成功地做到了。然而,当需要将它们与一天中的时间(晚上、下午、早上)进行比较时,我不知道如何比较它们。

我不想让你们写我的代码,我需要逻辑方面的帮助。正如您从屏幕截图中看到的那样,除了这个小而大的部分之外,这已经全部写好了。 任何想法将不胜感激!

[解决方案]

我正在使用 Laravel php 框架的 ORM,称为 Eloquent。

                $day_segments = array(
                    "morning" => range(0, 1200, 5),
                    "afternoon" => range(1200, 1600, 5),
                    "evening" => range(1600, 2400, 5)
                );

                // On what days of the week are users working and in what time ranges?
                $user_timeranges = array();
                foreach ($record->users()->get() as $user) {
                    foreach ($user->timeblocks as $timeblock) {
                        $start_range = date('Hi', strtotime("{$timeblock->start_hour} {$timeblock->start_divide}"));
                        $end_range = date('Hi', strtotime("{$timeblock->end_hour} {$timeblock->end_divide}"));

                        $user_timeranges[$timeblock->day][] = range($start_range, $end_range, 5);
                    }
                }

                // On each day what day segments are available to create appointments?
                $available_segments = array();
                foreach ($days_available as $day) {
                    $available_segments[$day] = array();
                    foreach ($day_segments as $name => $segment) {
                        $available_segments[$day][$name] = 0;
                        foreach ($user_timeranges[$day] as $timerange) {
                            if (array_intersect($segment, $timerange)) {
                                $available_segments[$day][$name]++;
                            }
                        }
                    }
                }

                vardump($available_segments);
                exit;

【问题讨论】:

  • 您似乎在要求我们为您完成这项工作。
  • 请不要这么想,我已经把所有东西都安排好了,我的 php 正在生成我在这个逻辑上遇到困难的一切。我不需要任何代码,我只是不明白如何编写。
  • @Munchies 我试图将所有内容分解为开始和结束时间块,我成功地做到了。但是,当需要将它们与一天中的时间(晚上、下午、早上)进行比较时,我不知道如何比较它们。
  • 为什么不能使用数据库?
  • 好像你已经解决了这个问题,但是在 SQL 环境中,如果你有开始和结束时间,你可以只查询“Select * where X between start and end”,如果你得到任何行你知道你遇到了一个交叉点。

标签: php date time range


【解决方案1】:

由于您似乎只按整小时工作,您可以使用range() 函数定义每个段,对于每个工作人员也是如此。然后使用array_intersect 看看你是否得到了真正的结果。

例子:

$times = Array("morning"=>range(0,12),"afternoon"=>range(12,16),"evening"=>range(16,24));
$people = Array("John"=>range(7,13),"Michael"=>range(13,19));
$available = Array();
foreach($times as $k=>$v) {
    $available[$k] = 0;
    foreach($people as $name=>$times) {
        if( array_intersect($v,$times)) $available[$k]++;
    }
}
var_dump($available);

【讨论】:

  • 正在研究 array_intersect() 并尝试这个会报告。
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2016-05-03
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多