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


Posted in PHP onNovember 12, 2009
/* 
| Author: Yang Yu <niceses@gmail.com> 
| @param char|int $start_date 一个有效的日期格式,例如:20091016,2009-10-16 
| @param char|int $end_date 同上 
| @return 给定日期之间的周末天数 
*/ 
function get_weekend_days($start_date,$end_date){ if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date); 
$start_reduce = $end_add = 0; 
$start_N = date('N',strtotime($start_date)); 
$start_reduce = ($start_N == 7) ? 1 : 0; 
$end_N = date('N',strtotime($end_date)); 
in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1; 
$days = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1; 
return floor(($days + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add; 
}

备注:

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

我这个函数的基本思路是四个字:前补后砍。没听懂吧?我也觉得有点莫名其妙。。。就是取得开始日期的星期数,如果不足一周,则补上对应的天数,比如开始日期是星期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)来算,因为通用性会不好,涉及到跨年的问题,如果跨多年,还要考虑闰年的问题,倒不如这样算来的直接。

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

function get_weekend_days($start_date,$end_date,$is_workday = false){ if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date); 
$start_reduce = $end_add = 0; 
$start_N = date('N',strtotime($start_date)); 
$start_reduce = ($start_N == 7) ? 1 : 0; 
$end_N = date('N',strtotime($end_date)); 
in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1; 
$alldays = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1; 
$weekend_days = floor(($alldays + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add; 
if ($is_workday){ 
$workday_days = $alldays - $weekend_days; 
return $workday_days; 
} 
return $weekend_days; 
}
PHP 相关文章推荐
用php写的serv-u的web申请账号的程序
Oct 09 PHP
一段防盗连的PHP代码
Dec 06 PHP
php 代码优化的42条建议 推荐
Sep 25 PHP
php实现网站插件机制的方法
Nov 10 PHP
php 读取shell管道传输过来的内容
Mar 01 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
利用PHP生成静态HTML文档的原理
Oct 29 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
php全局变量和类配合使用深刻理解
Jun 05 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
php格式化时间戳
Dec 17 PHP
php 分库分表hash算法
Nov 12 #PHP
PHP 面向对象实现代码
Nov 11 #PHP
超级简单的php+mysql留言本源码
Nov 11 #PHP
PHP 远程关机实现代码
Nov 10 #PHP
php实现网站插件机制的方法
Nov 10 #PHP
php 向访客和爬虫显示不同的内容
Nov 09 #PHP
php 将excel导入mysql
Nov 09 #PHP
You might like
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
SinaEditor使用方法详解
2013/12/28 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
jquery实现图片水平滚动效果代码分享
2015/08/26 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
js实现文字滚动效果
2016/03/03 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
extjs4图表绘制之折线图实现方法分析
2020/03/06 Javascript
微信小程序实现自定义底部导航
2020/11/18 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
[00:32]2018DOTA2亚洲邀请赛VG出场
2018/04/03 DOTA
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
python机器学习之决策树分类详解
2017/12/20 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
python把一个字符串切开的实例方法
2020/09/27 Python
python如何编写类似nmap的扫描工具
2020/11/06 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
公司办公室岗位职责
2014/03/19 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
辞职书格式样本
2015/02/26 职场文书
周一问候语大全
2015/11/10 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书