计算一段日期内的周末天数的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 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
php面向对象全攻略 (七) 继承性
Sep 30 PHP
20个PHP常用类库小结
Sep 11 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
php比较两个绝对时间的大小
Jan 31 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 PHP
CI框架中libraries,helpers,hooks文件夹详细说明
Jun 10 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
PHP读取word文档的方法分析【基于COM组件】
Aug 01 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
Apr 26 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
用PHP查询域名状态whois的类
2006/11/25 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
php实现源代码加密的方法
2015/07/11 PHP
使用JQuery进行跨域请求
2010/01/25 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中实现对list做减法操作介绍
2015/01/09 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
Django实现web端tailf日志文件功能及实例详解
2019/07/28 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
关于递归的一道.NET面试题
2013/05/12 面试题
如何撰写岗位职责
2014/02/01 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
宣传口号大全
2014/06/16 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
文明家庭事迹材料
2014/12/20 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
加班费申请报告
2015/05/15 职场文书
《法国号》教学反思
2016/02/22 职场文书
小学思想品德教学反思
2016/02/24 职场文书