给定一段时间,判断是否包含周末,并计算周末天数
sanlanlan 2017-11-25 标签: PHP 浏览:1470 评论: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)来算,因为通用性会不好,涉及到跨年的问题,如果跨多年,还要考虑闰年的问题,倒不如这样算来的直接。
发表评论: