计算一段日期内的周末天数的php代码(星期六,星期日总和)
2023-06-13 09:14:14 时间
/*
|Author:YangYu<niceses@gmail.com>
|@paramchar|int$start_date一个有效的日期格式,例如:20091016,2009-10-16
|@paramchar|int$end_date同上
|@return给定日期之间的周末天数
*/
functionget_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;
returnfloor(($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参数,可以选择是否返回工作日,默认是返回休息日
functionget_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 拼手气红包分配算法
- Linux上运行PHP的简易方法(linux如何运行php)
- PHP连接MySQL的实现方法(php怎么连接mysql)
- PHP实现从MySQL数据库中读取信息(php读取mysql数据)
- 数据PHP操作MySQL:删除数据(php删除mysql)
- Linux安装PHP: 一步一步教你搞定(linux上安装php)
- 提升 PHP 技能,一攻 MySQL 面试!(php面试Mysql)
- 内 php 耗时查看Oracle中PHP耗时的小时分解(oracle查询小时)
- 极速搭建:Linux下PHP网站快速创建(linux搭建php网站)
- PHP 如何调用 MySQL 函数(php调用mysql函数)
- PHP与MySQL的完美搭配,打造高效列表展示(php与mysql列表)
- 用Redis和PHP完成高效抢红包功能(redis抢红包php)
- PHP操作MySQL数据库详解,快速学习调用方法(php怎么调用mysql)
- PHP与MSSQL的良好配合,助力数据应用升级(php_mssql)
- PHP与MSSQL联合 处理日期数据(php mssql 日期)
- 文件Linux 下如何快速删除PHP文件(linux 删除php)
- Linux下编译安装PHP:一步步走向稳定性(linux编译安装php)
- PHP如何得到当前页和上一页的地址?
- php将fileterms函数返回的结果变成可读的形式
- php中用foreach来操作数组的代码
- PHP透明水印生成代码
- PHP以及MYSQL日期比较方法
- php计算两个日期时间差(返回年、月、日)
- CI框架Session.php源码分析
- php自动获取关键字的方法