计算一段日期内的周末天数的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 相关文章推荐
15种PHP Encoder的比较
Apr 17 PHP
php全排列递归算法代码
Oct 09 PHP
探讨php中防止SQL注入最好的方法是什么
Jun 10 PHP
php 模拟POST提交的2种方法详解
Jun 17 PHP
解析argc argv在php中的应用
Jun 24 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
thinkphp模板输出技巧汇总
Nov 24 PHP
PHP 常用的header头部定义汇总
Jun 19 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
tp5.1 框架查询表达式用法详解
May 25 PHP
PHP8.0新功能之Match表达式的使用
Jul 19 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
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
php调用C代码的实现方法
2014/03/11 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
基于javascript滚动图片具体实现
2013/11/18 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
python使用str &amp; repr转换字符串
2016/10/13 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
2019/06/14 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Pytorch环境搭建与基本语法
2020/06/03 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
教师自荐书
2013/10/08 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
幼儿体育课教学反思
2016/02/16 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
在Django中使用MQTT的方法
2021/05/10 Python