php 排除周末与节假日程序实例代码
发布:smiling 来源: PHP粉丝网 添加日期:2014-08-17 17:52:08 浏览: 评论:0
- date_default_timezone_set('prc');
- /**
- * 求取从某日起经过一定天数后的日期,
- * 排除周六周日和节假日
- * @param $start 开始日期
- * @param $offset 经过天数
- * @param $exception 例外的节假日
- * @param $allow 允许的日期(预留参数)
- * @return//开源代码phpfensi.com
- * examples:输入(2010-06-25,5,''),得到2010-07-02
- */
- function getendday( $start='now', $offset=0, $exception='', $allow='' ){
- //先计算不排除周六周日及节假日的结果
- $starttime = strtotime($start);
- $endtime = $starttime + $offset * 24 * 3600;
- $end = date('y-m-d', $endtime);
- //然后计算周六周日引起的偏移
- $weekday = date('n', $starttime);//得到星期值:1-7
- $remain = $offset % 7;
- $newoffset = 2 * ($offset - $remain) / 7;//每一周需重新计算两天
- if( $remain > 0 ){//周余凑整
- $tmp = $weekday + $remain;
- if( $tmp >= 7 ){
- $newoffset += 2;
- }else if( $tmp == 6 ){
- $newoffset += 1;
- }
- //考虑当前为周六周日的情况
- if( $weekday == 6 ){
- $newoffset -= 1;
- }else if( $weekday == 7 ){
- $newoffset -= 2;
- }
- }
- //再计算节假日引起的偏移
- if( is_array($exception) ){//多个节假日
- foreach ($exception as $day){
- $tmp_time = strtotime($day);
- if( $tmp_time>$starttime && $tmp_time<=$endtime ){//在范围(a,b]内
- $weekday_t = date('n', $tmp_time);
- if($weekday_t <= 5){//防止节假日与周末重复
- $newoffset += 1;
- }
- }
- }
- }else{//单个节假日
- if( $exception!='' ){
- $tmp_time = strtotime($exception);
- if( $tmp_time>$starttime && $tmp_time<=$endtime ){
- $weekday_t = date('n', $tmp_time);
- if($weekday_t <= 5){
- $newoffset += 1;
- }
- }
- }
- }
- //根据偏移天数,递归做等价运算111cn.net
- if($newoffset > 0){
- #echo "[{$start} -> {$offset}] = [{$end} -> {$newoffset}]"."<br /> ";
- return getendday($end,$newoffset,$exception,$allow);
- }else{
- return $end;
- }
- }
- /**
- * 暴力循环方法
- */
- function getendday2( $start='now', $offset=0, $exception='', $allow='' ){
- $starttime = strtotime($start);
- $tmptime = $starttime + 24*3600;
- while( $offset > 0 ){
- $weekday = date('n', $tmptime);
- $tmpday = date('y-m-d', $tmptime);
- $bfd = false;//是否节假日
- if(is_array($exception)){
- $bfd = in_array($tmpday,$exception);
- }else{
- $bfd = ($exception==$tmpday);
- }
- if( $weekday<=5 && !$bfd){//不是周末和节假日
- $offset--;
- #echo "tmpday={$tmpday}"."<br />";
- }
- $tmptime += 24*3600;
- }
- return $tmpday;
- }
- $exception = array(
- '2010-01-01','2010-01-02','2010-01-03',
- '2010-04-03','2010-04-04','2010-04-05',
- '2010-05-01','2010-05-02','2010-05-03',
- '2010-06-14','2010-06-15','2010-06-16',
- '2010-09-22','2010-09-23','2010-09-24',
- '2010-10-01','2010-10-02','2010-10-03','2010-10-04',
- '2010-10-05','2010-10-06','2010-10-07',
- );
- //echo getendday('2010-08-27',3,'');
- //echo getendday('2010-06-25',15,'2010-07-07');
- $t1 = microtime();
- echo getendday('2010-05-12',66,$exception)."<br />";
- $t2 = microtime();echo "use ".($t2-$t1)." s <br />";
- echo getendday2('2010-05-12',66,$exception)."<br />";
- $t3 = microtime();echo "use ".($t3-$t2)." s <br />";
Tags: php 排除周末 节假日
相关文章
- ·PHP 是什么?(2013-11-12)
- ·Php.ini文件位置在哪里 Php.ini文件找不到(2013-11-12)
- ·PHP 数据类型(2013-11-12)
- ·php 获取当前脚本的url(2013-11-12)
- ·php技术生成静态页面的实现(2013-11-13)
- ·缺陷月项目启动 披露PHP脚本语言漏洞(2013-11-13)
- ·在PHP中全面阻止SQL注入式攻击(2013-11-13)
- ·php生成随机密码的几种方法(2013-11-13)
- ·PHP中使用FCKeditor2.3.2配置(2013-11-13)
- ·如何使用PHP开发高效的WEB系统(2013-11-13)
- ·php:树形结构的算法(2013-11-13)
- ·php4和php5区别(2013-11-13)
- ·php数据库连接(2013-11-13)
- ·如何正确理解PHP的错误信息(2013-11-13)
- ·php页面漏洞分析及相关问题解决(2013-11-13)
- ·当在连接PHP时,抱怨一些数值没有定义参考?(2013-11-27)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)