首页 > php教程 > php手册 > 正文

php 排除周末与节假日程序实例代码

php中文网
发布: 2016-05-25 16:42:30
原创
2028人浏览过

<?php
date_default_timezone_set('prc'); 
/** 
* 求取从某日起经过一定天数后的日期, 
* 排除周六周日和节假日 
* @param $start       开始日期 
* @param $offset      经过天数 
* @param $exception 例外的节假日 
* @param $allow       允许的日期(预留参数) 
* @return//开源代码phprm.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 />";
登录后复制


永久链接:

转载随意!带上文章地址吧。

寻鲸AI
寻鲸AI

寻鲸AI是一款功能强大的人工智能写作工具,支持对话提问、内置多场景写作模板如写作辅助类、营销推广类等,更能一键写作各类策划方案。

寻鲸AI 68
查看详情 寻鲸AI
相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号