计算一段日期内的周末天数的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 相关文章推荐
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
php实现遍历目录并删除指定文件中指定内容
Jan 21 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
php计算整个目录大小的方法
Jun 01 PHP
Symfony2函数用法实例分析
Mar 18 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
php实现数据库的增删改查
Feb 26 PHP
php+ajax实现异步上传文件或图片功能
Jul 18 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
Oct 15 PHP
laravel 框架实现无限级分类的方法示例
Oct 31 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 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 4.2书写安全的脚本
2006/10/09 PHP
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
php计算整个目录大小的方法
2015/06/01 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
JavaScript防止全局变量污染的方法总结
2018/08/02 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
Python Paramiko模块的使用实际案例
2018/02/01 Python
深入浅析Python的类
2018/06/22 Python
Django实现分页功能
2018/07/02 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
在python中利用try..except来代替if..else的用法
2019/12/19 Python
python实时监控logstash日志代码
2020/04/27 Python
Python内置函数locals和globals对比
2020/04/28 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
高一历史教学反思
2014/01/13 职场文书
新三好学生主要事迹
2014/01/23 职场文书
本科毕业生求职信
2014/06/15 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
对PyTorch中inplace字段的全面理解
2021/05/22 Python
Mysql文件存储图文详解
2021/06/01 MySQL
解析python中的jsonpath 提取器
2022/01/18 Python
室外天线与收音机天线杆接合方法
2022/04/05 无线电