计算一段日期内的周末天数的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模拟SQL Server的两个日期处理函数
Oct 09 PHP
php实现mysql数据库备份类
Mar 20 PHP
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
php一些错误处理的方法与技巧总结
Aug 10 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
php 删除cookie方法详解
Dec 01 PHP
PHP输出日历表代码实例
Mar 27 PHP
php实现CSV文件导入和导出
Oct 24 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
PHP simplexml_import_dom()函数讲解
Feb 03 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 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版本到PHP7
2015/02/06 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
接收键盘指令的脚本
2006/06/26 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
JS实现拖动示例代码
2013/11/01 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
清除输入框内的空格
2016/12/21 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
深入理解Vuex 模块化(module)
2017/09/26 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
2020/04/13 Javascript
python批量导出导入MySQL用户的方法
2013/11/15 Python
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python3+PyQt5使用数据库窗口视图
2018/04/24 Python
Python使用requests提交HTTP表单的方法
2018/12/26 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
python异常触发及自定义异常类解析
2019/08/06 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
个人实习生的自我评价
2014/02/16 职场文书
新法人代表任命书
2014/06/06 职场文书
员工工作及收入证明
2014/10/28 职场文书
2014年财政工作总结
2014/12/10 职场文书
2015年端午节活动总结
2015/02/11 职场文书