Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Google Calendar API算法,用于查找给定日期的开放时间段_Php_Algorithm_Date_Datetime_Google Calendar Api - Fatal编程技术网

Php Google Calendar API算法,用于查找给定日期的开放时间段

Php Google Calendar API算法,用于查找给定日期的开放时间段,php,algorithm,date,datetime,google-calendar-api,Php,Algorithm,Date,Datetime,Google Calendar Api,我正试图利用谷歌日历(和谷歌日历API)来实现简单的日程安排。我正在使用PHP、MySQL和google api PHP客户端。我正在寻找一种算法或伪代码来找到开放的时隙 我的日历中有繁忙时间的活动,如业务结束时和当前约会。我能够通过两个函数(Events:list和Freebusy:query)检索事件开始和结束时间。以下是今天的事件示例列表,开始时间为2016-02-19T01:00:00-07:00,结束时间为2016-02-19T23:00:00-07:00(当天的所有内容) 营业时间为

我正试图利用谷歌日历(和谷歌日历API)来实现简单的日程安排。我正在使用PHP、MySQL和google api PHP客户端。我正在寻找一种算法或伪代码来找到开放的时隙

我的日历中有繁忙时间的活动,如业务结束时和当前约会。我能够通过两个函数(Events:list和Freebusy:query)检索事件开始和结束时间。以下是今天的事件示例列表,开始时间为2016-02-19T01:00:00-07:00,结束时间为2016-02-19T23:00:00-07:00(当天的所有内容)

营业时间为上午12:00至11:00 开始:“2016-02-19T00:00:00-07:00”
完:“2016-02-19T11:00:00-07:00”

预约时间为下午1:30至2:30 开始:“2016-02-19T13:30:00-07:00”
完:“2016-02-19T14:30:00-07:00”

预约时间为下午5:00至7:00 开始:“2016-02-19T17:00:00-07:00”
完:“2016-02-19T19:00:00-07:00”

预约时间为晚上9:00到11:00 开始:“2016-02-19T21:00:00-07:00”
完:“2016-02-19T23:00:00-07:00”

基于此示例事件集,我的开放时间段为:上午11:00到下午1:30、下午2:30到下午5:00、晚上7:00到晚上9:00以及晚上11:00到12:00

  • 如何以编程方式查找这组时间 理想情况下,我希望通过一次API调用获得给定一天的完整事件列表,并解释/操作该列表,而不是使用特定的开始和结束时间进行多次调用,这将为我提供我正在寻找的信息,但效率非常低

  • 找到集合后,如何以30分钟为增量显示结果,即可用的约会开始时间为:
  • 11:00,11:30,12:00,12:30,1:00,2:30,3:30,4:00,4:30,9:00,9:30,10:00,10:30,11:00,11:30

    我很难在处理日期/时间数据集时绞尽脑汁

    这是一张照片。相关日期为2016年2月19日


    谢谢你。本次讨论的任何来源都将发布以供参考。

    我会将日期转换为unix时间戳,并计算开始日期和结束日期之间的差异。这就是我将如何完成你问题的第一部分:

    $events = array(
        array(
            'start' => '2016-02-19T00:00:00-07:00',
            'end' => '2016-02-19T11:00:00-07:00'
        ),
        array(
            'start' => '2016-02-19T13:30:00-07:00',
            'end' => '2016-02-19T14:30:00-07:00'
        ),
        array(
            'start' => '2016-02-19T17:00:00-07:00',
            'end' => '2016-02-19T19:00:00-07:00'
        ),
        array(
            'start' => '2016-02-19T21:00:00-07:00',
            'end' => '2016-02-19T23:00:00-07:00'
        )
    );
    
    $free_time_slots = array();
    $count = count($events)-1;
    $i = 0;
    foreach($events as $event) {
        if ($i < $count) {
            $free_time = strtotime($events[$i+1]['start']) - strtotime($event['end']);
            $free_time_slots[] = array(
                'start' => date("F j, Y, g:i a", strtotime($event['end'])),
                'end' => date("F j, Y, g:i a", strtotime($events[$i+1]['start'])),
                'minutes' => $free_time / 60
            );
            $i++;
        }
    }  
    echo '<pre>';
    print_r($free_time_slots);
    

    这应该可以完成工作。您可以在要搜索的时间范围内循环浏览每个约会时段。在该循环中,您可以检查当前的每个约会,以查看是否存在冲突。这段代码将在每次迭代后回显打开的约会,但您可能希望将它们放入一个数组中,以便在需要时使用它们

    Open appt at: 2016-02-19 11:00:00-America/Denver
    Open appt at: 2016-02-19 11:30:00-America/Denver
    Open appt at: 2016-02-19 12:00:00-America/Denver
    Open appt at: 2016-02-19 12:30:00-America/Denver
    Open appt at: 2016-02-19 01:00:00-America/Denver
    Open appt at: 2016-02-19 02:30:00-America/Denver
    Open appt at: 2016-02-19 03:00:00-America/Denver
    Open appt at: 2016-02-19 03:30:00-America/Denver
    Open appt at: 2016-02-19 04:00:00-America/Denver
    Open appt at: 2016-02-19 04:30:00-America/Denver
    Open appt at: 2016-02-19 07:00:00-America/Denver
    Open appt at: 2016-02-19 07:30:00-America/Denver
    Open appt at: 2016-02-19 08:00:00-America/Denver
    Open appt at: 2016-02-19 08:30:00-America/Denver
    Open appt at: 2016-02-19 11:00:00-America/Denver
    Open appt at: 2016-02-19 11:30:00-America/Denver
    

    谢谢@尼克霍姆普森
    // Set timezone = UTC for consistency
    date_default_timezone_set("UTC");
    
    // Range to search for open times in.
    $start_time = strtotime("2016-02-19T00:00:00-07:00");
    $end_time = strtotime("2016-02-19T23:59:59-07:00");
    
    // Test data
    $events = array(
        "event_1" => array(
            "start" => "2016-02-19T00:00:00-07:00",
            "end" => "2016-02-19T11:00:00-07:00"
        ),
        "event_2" => array(
            "start" => "2016-02-19T13:30:00-07:00",
            "end" => "2016-02-19T14:30:00-07:00"
        ),
        "event_3" => array(
            "start" => "2016-02-19T17:00:00-07:00",
            "end" => "2016-02-19T19:00:00-07:00"
        ),
        "event_4" => array(
            "start" => "2016-02-19T21:00:00-07:00",
            "end" => "2016-02-19T23:00:00-07:00"
        ),
    );
    
    // Kick off first appt time at beginning of the day.
    $appt_start_time = $start_time;
    
    // Loop through each appt slot in the search range.
    while ($appt_start_time < $end_time) {
        // Add 29:59 to the appt start time so we know where the appt will end.
        $appt_end_time = ($appt_start_time + 1799);
    
        // For each appt slot, loop through the current appts to see if it falls
        // in a slot that is already taken.
        $slot_available = true;
        foreach ($events as $event => $times) {
            $this_start = strtotime($times['start']);
            $this_end = strtotime($times['end']);
    
            // If the appt start time or appt end time falls on a current appt, slot is taken.
            if (($appt_start_time >= $this_start && $appt_start_time < $this_end) ||
                ($appt_end_time >= $this_start && $appt_end_time < $this_end)) {
                $slot_available = false;
                break; // No need to continue if it's taken.
            }
        }
    
        // If we made it through all appts and the slot is still available, it's an open slot.
        if ($slot_available) {
            $date = new DateTime();
            $date->setTimestamp($appt_start_time);
            $date->setTimezone(new DateTimeZone("America/Denver"));
            echo "Open appt at: ". $date->format("Y-m-d h:i:s-e") ."<br />";
        }
    
        // + 30 minutes
        $appt_start_time += (60 * 30);
    }
    
    Open appt at: 2016-02-19 11:00:00-America/Denver
    Open appt at: 2016-02-19 11:30:00-America/Denver
    Open appt at: 2016-02-19 12:00:00-America/Denver
    Open appt at: 2016-02-19 12:30:00-America/Denver
    Open appt at: 2016-02-19 01:00:00-America/Denver
    Open appt at: 2016-02-19 02:30:00-America/Denver
    Open appt at: 2016-02-19 03:00:00-America/Denver
    Open appt at: 2016-02-19 03:30:00-America/Denver
    Open appt at: 2016-02-19 04:00:00-America/Denver
    Open appt at: 2016-02-19 04:30:00-America/Denver
    Open appt at: 2016-02-19 07:00:00-America/Denver
    Open appt at: 2016-02-19 07:30:00-America/Denver
    Open appt at: 2016-02-19 08:00:00-America/Denver
    Open appt at: 2016-02-19 08:30:00-America/Denver
    Open appt at: 2016-02-19 11:00:00-America/Denver
    Open appt at: 2016-02-19 11:30:00-America/Denver