计算一段日期内的周末天数的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中通过ADO调用Access数据库的方法测试不通过
Dec 31 PHP
php获取mysql版本的几种方法小结
Mar 25 PHP
php中autoload的用法总结
Nov 08 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
php获取淘宝分类id示例
Jan 16 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
php通过正则表达式记取数据来读取xml的方法
Mar 09 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 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
php5 and xml示例
2006/11/22 PHP
完整删除ecshop中获取店铺信息的API
2014/12/24 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
js文字滚动停顿效果代码
2008/06/28 Javascript
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
比较全面的event对像在IE与FF中的区别 推荐
2009/09/21 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
详解babel升级到7.X采坑总结
2019/05/12 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
Python的math模块中的常用数学函数整理
2016/02/04 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
Python PIL库图片灰化处理
2020/04/07 Python
全球度假村:Club Med
2017/11/27 全球购物
汉森批发:Hansen Wholesale
2018/05/24 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
创业计划书的内容步骤和要领
2014/01/04 职场文书
商务英语求职信范文
2015/03/19 职场文书
2016高考感言
2015/08/01 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
导游词之介休绵山
2019/12/31 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js