计算一段日期内的周末天数的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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
PHP静态新闻列表自动生成代码
Jun 14 PHP
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 PHP
有关PHP性能优化的介绍
Jun 20 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
yii2.0之GridView自定义按钮和链接用法
Dec 15 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
PHP XML Expat解析器知识点总结
Feb 15 PHP
PHP explode()函数用法讲解
Feb 15 PHP
php+Ajax无刷新验证用户名操作实例详解
Mar 04 PHP
Yii redis集合的基本使用教程
Jun 14 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(1)
2006/10/09 PHP
如何去掉文章里的 html 语法
2006/10/09 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
2017/03/07 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
[48:32]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
利用Python查看目录中的文件示例详解
2017/08/28 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
django如何连接已存在数据的数据库
2018/08/14 Python
NLTK 3.2.4 环境搭建教程
2018/09/19 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Django Celery异步任务队列的实现
2019/07/24 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Python类super()及私有属性原理解析
2020/06/15 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
python调用私有属性的方法总结
2020/07/24 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
利用Bootstrap实现漂亮简洁的CSS3价格表实例源码
2017/03/02 HTML / CSS
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
音乐幼师求职信
2014/07/09 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书
员工加薪申请报告
2015/05/15 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python