给定一段时间,判断是否包含周末,并计算周末天数

sanlanlan 2017-11-25 标签: PHP 浏览:1005 评论:0

有时我们在工作中国需要某个时间段进行某项任务,或者需要对周末这个特殊时间做特殊处理。

使用PHP可以实现,判断这个时间段,是否包含周末,及计算周末的时间


1.//判断是否包含周末
function isWeekend($start_time,$end_time)
{
    $time_diff = intval($end_time-$start_time);
    $week_time = 60 * 60 * 24 * 7;
    if($time_diff >= $week_time){
        return true;
    }else if($time_diff > 0 && $time_diff < $time_diff){
        $end_time = date('N',$end_time);
        $start_time = date('N',$start_time);
        if(in_array($end_time,[6,7]) || in_array($start_time,[6,7])){
            return true;
        }else{
            if($start_time > $end_time){
                return true;
            }else{
                return false;
            }
        }
    }

}


2.//
function getWeekendDays($start_time,$end_time,$isWorkday = 0){
    $start_time_num = strtotime($start_time);
    $end_time_num = strtotime($end_time);
    $weekArray = [6,7];
    if ($start_time_num > $end_time_num) list($start_time, $end_time) = array($end_time, $start_time);

    $start_reduce = $end_add = 0;
    $start_N = date('N',$start_time_num);
    $start_reduce = ($start_N == 7) ? 1 : 0;
    $end_N = date('N',$end_time_num);

    in_array($end_N,$weekArray) && $end_add = ($end_N == 7) ? 2 : 1;
    $all_days = abs($end_time_num - $start_time_num)/86400 + 1;
    $weekend_days = floor(($all_days + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add;
    if ($isWorkday){
        $workdays = $all_days - $weekend_days;
        return $workdays;
    }
    return $weekend_days;
}


ps:

这个函数的基本思路是四个字:前加后减。就是取得开始日期的星期数,如果不足一周,则补上对应的天数,比如开始日期是星期3,那么总天数就补上2天(星期1,星期2),如果开始日期是星期6,则补上5天,也就是6-1,就是函数中的$start_N - 1,如果开始日期恰好是周日,那么补上6天的同时,最后的结果需要减去一天(周六),也就是函数中的 $start_reduce ,这就是“前加”。“后减”,顾名思义,就是将后面多余的不足一周的天数,减掉,例如,结束日期为星期3,那么就从总天数里减去3天,如果结束日期为星期6或者星期天,那么减去6或7的同时,还要在最后加上1或2。

算法核心思想就是将这个时间段调整为7的整数,然后乘以2,在减去或加上多算和少算的周六或周日,得到的就是星期六和星期日的总和。最后算一段时间内的天数,不建议用date(z)来算,因为通用性会不好,涉及到跨年的问题,如果跨多年,还要考虑闰年的问题,倒不如这样算来的直接。


http://www.jb51.net/article/20886.htm

本文相关标签: php 周末 时间段

发表评论: