计算一段日期内的周末天数的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.ini中文版(2)
Oct 09 PHP
mysql5详细安装教程
Jan 15 PHP
php入门小知识
Mar 24 PHP
PHP 全角转半角实现代码
May 16 PHP
Apache 配置详解(最好的APACHE配置教程)
Jul 04 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
Jul 03 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
PHP编写daemon process 实例详解
Nov 13 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 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
PHPExcel简单读取excel文件示例
2016/05/26 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
Javascript 中介者模式实例
2009/12/16 Javascript
js prototype截取字符串函数
2010/04/01 Javascript
js 自动播放的实例代码
2013/11/19 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
Python functools模块学习总结
2015/05/09 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
python编程的核心知识点总结
2021/02/08 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
工程师求职简历的自我评价分享
2013/10/10 职场文书
会计专业自我鉴定
2014/02/10 职场文书
学生请假条
2014/04/11 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
运动会演讲稿100字
2014/08/25 职场文书
骨干教师申报材料
2014/12/17 职场文书
企业财务经理岗位职责
2015/04/08 职场文书
五一晚会主持词
2015/07/01 职场文书
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸
使用Python获取字典键对应值的方法
2022/04/26 Python