计算一段日期内的周末天数的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程序员最常犯的11个MySQL错误小结
Nov 20 PHP
PHP的一个基础知识 表单提交
Jul 04 PHP
php顺序查找和二分查找示例
Mar 27 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
php基于mcrypt的加密解密实例
Oct 27 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
php 参数过滤、数据过滤详解
Oct 26 PHP
php文件上传后端处理小技巧
May 22 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
php封装的page分页类完整实例
Oct 18 PHP
详解如何实现Laravel的服务容器的方法示例
Apr 15 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 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
一个简单的域名注册情况查询程序
2006/10/09 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
Prototype Number对象 学习
2009/07/19 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
ajax更新数据后,jquery、jq失效问题
2011/03/16 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
jQuery简易图片放大特效示例代码
2014/06/09 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
Python help()函数用法详解
2014/03/11 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
Python的Flask框架的简介和安装方法
2015/11/13 Python
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Python实现的购物车功能示例
2018/02/11 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
Python 中@property的用法详解
2020/01/15 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
武汉瑞得软件笔试题
2015/10/27 面试题
高中毕业自我鉴定
2013/12/22 职场文书
小区停车场管理制度
2014/01/27 职场文书
机关作风建设工作总结
2014/10/23 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
经典导游欢迎词
2015/01/26 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
优秀大学生申请书
2019/06/24 职场文书