• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

计算一段日期内的周末天数的php代码(星期六,星期日总和)_php技巧

php 搞代码 3年前 (2022-01-26) 14次浏览 已收录 0个评论
 <BR>/* <BR>| Author: Yang Yu  <BR>| @param char|int $start_date 一个有效的日期格式,例如:20091016,2009-10-16 <BR>| @param char|int $end_date 同上 <BR>| @return 给定日期之间的周末天数 <BR>*/ <BR>function get_weekend_days($start_date,$end_date){ <br><br>if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date); <br><br>$start_reduce = $end_add = 0; <br><br>$start_N = date('N',strtotime($start_date)); <BR>$start_reduce = ($start_N == 7) ? 1 : 0; <br><br>$end_N = date('N',strtotime($end_date)); <BR>in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1; <br><br>$days = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1; <br><br>return floor(($days + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add; <BR>} <BR>


备注:

最近写给公司用的考勤系统,把其中的一个功能自动化,就是每个月的工作日(出勤天数)改为自动写入,于是写出以上函数,用来计算两个日期内的周六周日总数,稍微解释下吧,这个功能当然是用循环实现是最简单的,从开始那天for到结束那天,中间只要是周六或周日,就++,最后轻易算出总和,但还是那句话,循环的效率实在是不好,尤其当时间跨度过长时,惨不忍睹。

我这个函数的基本思路是四个字:前补后砍。没听懂吧?我也觉得有点莫名其妙。。。就是取得开始日期的星期数,如果不足一周,则补上对应的天数,比如开始日期是星期3,那么总天数就补上2天(星期1,星期2),如果开始日期是星期6,则补上5天,也就是6-1,就是函数中的$start_N – 1,如果开始日期恰好是周日,那么补上6天的同时,最后的结果需要减去一天(周六),也就是函数中的 $*本文来源gaodai#ma#com搞@代~码^网+搞代gaodaima码start_reduce ,好了,现在“前补”解释完了。下面讲下“后砍”,顾名思义,就是将后面多余的不足一周的天数,砍掉,例如,结束日期为星期3,那么就从总天数里减去3天,如果结束日期为星期6或者星期天,那么减去6或7的同时,还要在最后补上1或2。

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

改进记录,加入$is_workday 参数,可以选择是否返回工作日,默认是返回休息日

 <BR>function get_weekend_days($start_date,$end_date,$is_workday = false){ <br><br>if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date); <BR>$start_reduce = $end_add = 0; <BR>$start_N = date('N',strtotime($start_date)); <BR>$start_reduce = ($start_N == 7) ? 1 : 0; <BR>$end_N = date('N',strtotime($end_date)); <BR>in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1; <BR>$alldays = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1; <BR>$weekend_days = floor(($alldays + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add; <BR>if ($is_workday){ <BR>$workday_days = $alldays - $weekend_days; <BR>return $workday_days; <BR>} <BR>return $weekend_days; <BR>} <BR>

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:计算一段日期内的周末天数的php代码(星期六,星期日总和)_php技巧
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址