计算一段日期内的周末天数的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 相关文章推荐
拼音码表的生成
Oct 09 PHP
main.php
Dec 09 PHP
php设计模式 Visitor 访问者模式
Jun 28 PHP
php的一个简单加密解密代码
Jan 14 PHP
PHP实现算式验证码和汉字验证码实例
Mar 09 PHP
如何利用http协议发布博客园博文评论
Aug 03 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
Apr 11 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
PHP排序二叉树基本功能实现方法示例
May 26 PHP
PHP合并两个或多个数组的方法
Jan 20 PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 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
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
php实现的网页版剪刀石头布游戏示例
2016/11/25 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
javascript 闭包详解
2015/02/15 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
Node.js操作mysql数据库增删改查
2016/03/30 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
详解webpack require.ensure与require AMD的区别
2017/12/13 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
python实现维吉尼亚加密法
2019/03/20 Python
python分数表示方式和写法
2019/06/26 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
Python实现GIF图倒放
2020/07/16 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
公司员工检讨书
2014/02/08 职场文书
爱国主义演讲稿
2014/05/07 职场文书
学习型班组申报材料
2014/05/31 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
优秀大学生事迹材料
2014/12/24 职场文书
会计工作能力自我评价
2015/03/05 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python