从9:00到18:00的一系列工作时间

时间:2018-06-20 12:57:07

标签: php time timestamp

我需要将工作时间报告保存到数据库中。工作时间是从9:00到18:00

  • 我有开始日期:2018/06/01 13:00:00

  • 结束日期:2018/06/04 17:00:00

结果应该是每个工作日的一系列报告:

  1. 6月1日:签到- 13:00 ;结帐 18:00
    -跳过了两个周末-
  2. 6月4日:签到- 09:00 ;结帐 18:00 ;
  3. 6月5日:签入 09:00 ;结帐 18:00 ;
  4. 6月6日:签入 9:00 ;结帐 17:00 ;

有什么想法吗?

编辑:不要误会我的意思,我不希望有人为我编写代码:)我只需要一个提示即可了解如何使循环知道每天何时开始和何时结束。应该在提供的每个工作日中每个小时循环一次吗?

2 个答案:

答案 0 :(得分:0)

好吧,首先,您需要使用诸如date()或Datetime()类之类的php函数遍历每一天。然后(在循环中)您需要将日期和各自的工作时间添加到数组中,但始终要检查日期是否是周末(您可以使用上述函数或类来实现)。循环之后,将数组插入数据库。

答案 1 :(得分:0)

所以,我终于弄清楚了。我将其粘贴在此处,以防有人从中获得灵感。

    function get_working_days($start_time = "", $end_time = "") {

        //getting the difference between $start_time and $end_time in days
        $diff = ceil(($end_time - $start_time) / 60 / 60 / 24);

        // fixing the difference if the request is for 1 day only
        if (($end_time - $start_time) > 32400 && ($end_time - $start_time) < 86400) {
            $diff += 1;
        }

        // 9:00 of the current day
        $day_start = strtotime("midnight", $start_time) + 32400;

        // 18:00 of the current day
        $day_end = strtotime("midnight", $end_time) + 64800;

        // setting the current day
        $curr_day = $day_start;

        // initiating the array
        $return = [];

        // looping through each day using the $diff variable
        for ($i=0; $i < $diff; $i++) {

            // adding reports while skipping weekends
            if (!is_weekend($curr_day)) {
                if ($i == 0 && $diff <= 1) { 
                    // first and only iteration
                    $return[] = array("checkin" => $start_time, "checkout" => $end_time);
                }elseif ($i == 0 && $i < ($diff - 1)) { 
                    // first but not only iteration
                    $return[] = array("checkin" => $start_time, "checkout" => $curr_day + 32400);
                }elseif ($i < ($diff - 1)) { 
                    // middle 
                    $return[] = array("checkin" => $curr_day, "checkout" => $curr_day + 32400);
                }else{ 
                    // end
                    $return[] = array("checkin" => $curr_day, "checkout" => $end_time);
                }
            }
            // going to the next day
            $curr_day += 86400;
        }

        return $return;
}