计算一段日期内的周末天数的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 相关文章推荐
模仿OSO的论坛(二)
Oct 09 PHP
JS实现php的伪分页
May 25 PHP
PHP cron中的批处理
Sep 16 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
May 04 PHP
php取得字符串首字母的方法
Mar 25 PHP
PHP文件上传类实例详解
Apr 08 PHP
Apache无法自动跳转却显示目录的解决方法
Nov 30 PHP
php中str_pad()函数用法分析
Mar 28 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
Thinkphp自定义生成缩略图尺寸的方法
Aug 05 PHP
PHP哈希表实现算法原理解析
Dec 11 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
短波的认识
2021/03/01 无线电
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
php单例模式示例分享
2015/02/12 PHP
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
JSON对象 详解及实例代码
2016/10/18 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
JS二分查找算法详解
2017/11/01 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
关于AngularJS中几种Providers的区别总结
2020/05/17 Javascript
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
python实现杨辉三角思路
2017/07/14 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
浅谈Python编程中3个常用的数据结构和算法
2019/04/30 Python
python计算n的阶乘的方法代码
2019/10/25 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
windows10 pycharm下安装pyltp库和加载模型实现语义角色标注的示例代码
2020/05/07 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
CSS3实现千变万化的文字阴影text-shadow效果设计
2016/04/26 HTML / CSS
德国拖鞋网站:German Slippers
2019/11/08 全球购物
英国森林假期:Forest Holidays
2021/01/01 全球购物
外语系大学生自荐信范文
2014/03/01 职场文书
英语故事演讲稿
2014/04/29 职场文书
大专学生求职自荐信
2014/07/06 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2014年副班长工作总结
2014/12/10 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
教师远程培训心得体会
2016/01/09 职场文书
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏