首页 > 开发 > PHP > 正文

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

2024-05-04 21:58:31
字体:大 中 小
来源:转载
供稿:网友
  1. date_default_timezone_set('prc'); 
  2. /** 
  3. * 求取从某日起经过一定天数后的日期, 
  4. * 排除周六周日和节假日 
  5. * @param $start       开始日期 
  6. * @param $offset      经过天数 
  7. * @param $exception 例外的节假日 
  8. * @param $allow       允许的日期(预留参数) 
  9. * @return//开源代码Vevb.com 
  10. *  examples:输入(2010-06-25,5,''),得到2010-07-02 
  11. */ 
  12. function getendday( $start='now', $offset=0, $exception='', $allow='' ){ 
  13.     //先计算不排除周六周日及节假日的结果 
  14.     $starttime = strtotime($start); 
  15.     $endtime = $starttime + $offset * 24 * 3600; 
  16.     $end = date('y-m-d', $endtime); 
  17.     //然后计算周六周日引起的偏移 
  18.     $weekday = date('n', $starttime);//得到星期值:1-7 
  19.     $remain = $offset % 7; 
  20.     $newoffset = 2 * ($offset - $remain) / 7;//每一周需重新计算两天 
  21.     if( $remain > 0 ){//周余凑整 
  22.         $tmp = $weekday + $remain; 
  23.         if( $tmp >= 7 ){ 
  24.             $newoffset += 2; 
  25.         }else if( $tmp == 6 ){ 
  26.             $newoffset += 1; 
  27.         } 
  28.         //考虑当前为周六周日的情况 
  29.         if( $weekday == 6 ){ 
  30.             $newoffset -= 1; 
  31.         }else if( $weekday == 7 ){ 
  32.             $newoffset -= 2; 
  33.         } 
  34.     } 
  35.     //再计算节假日引起的偏移 
  36.     if( is_array($exception) ){//多个节假日 
  37.         foreach ($exception as $day){ 
  38.             $tmp_time = strtotime($day); 
  39.             if( $tmp_time>$starttime && $tmp_time<=$endtime ){//在范围(a,b]内 
  40.                 $weekday_t = date('n', $tmp_time); 
  41.                 if($weekday_t <= 5){//防止节假日与周末重复 
  42.                     $newoffset += 1; 
  43.                 } 
  44.             } 
  45.         } 
  46.     }else{//单个节假日 
  47.         if( $exception!='' ){ 
  48.             $tmp_time = strtotime($exception); 
  49.             if( $tmp_time>$starttime && $tmp_time<=$endtime ){ 
  50.                 $weekday_t = date('n', $tmp_time); 
  51.                 if($weekday_t <= 5){ 
  52.                     $newoffset += 1; 
  53.                 } 
  54.             } 
  55.         } 
  56.          
  57.     } 
  58.     //根据偏移天数,递归做等价运算111cn.net 
  59.     if($newoffset > 0){ 
  60.         #echo "[{$start} -> {$offset}] = [{$end} -> {$newoffset}]"."<br /> "; 
  61.         return getendday($end,$newoffset,$exception,$allow); 
  62.     }else{ 
  63.         return $end; 
  64.     } 
  65. } 
  66. /** 
  67. * 暴力循环方法 
  68. */ 
  69. function getendday2( $start='now', $offset=0, $exception='', $allow='' ){ 
  70.     $starttime = strtotime($start); 
  71.     $tmptime = $starttime + 24*3600; 
  72.      
  73.     while( $offset > 0 ){ 
  74.         $weekday = date('n', $tmptime); 
  75.         $tmpday = date('y-m-d', $tmptime); 
  76.         $bfd = false;//是否节假日 
  77.         if(is_array($exception)){ 
  78.             $bfd = in_array($tmpday,$exception); 
  79.         }else{ 
  80.             $bfd = ($exception==$tmpday); 
  81.         } 
  82.         if( $weekday<=5 && !$bfd){//不是周末和节假日 
  83.             $offset--; 
  84.             #echo "tmpday={$tmpday}"."<br />"; 
  85.         } 
  86.         $tmptime += 24*3600; 
  87.     } 
  88.      
  89.     return $tmpday; 
  90. } 
  91. $exception = array( 
  92.     '2010-01-01','2010-01-02','2010-01-03', 
  93.     '2010-04-03','2010-04-04','2010-04-05', 
  94.     '2010-05-01','2010-05-02','2010-05-03', 
  95.     '2010-06-14','2010-06-15','2010-06-16', 
  96.     '2010-09-22','2010-09-23','2010-09-24', 
  97.     '2010-10-01','2010-10-02','2010-10-03','2010-10-04', 
  98.     '2010-10-05','2010-10-06','2010-10-07', 
  99.      
  100. ); 
  101. //echo getendday('2010-08-27',3,''); 
  102. //echo getendday('2010-06-25',15,'2010-07-07'); 
  103. $t1 = microtime(); 
  104. echo getendday('2010-05-12',66,$exception)."<br />"; 
  105. $t2 = microtime();echo "use ".($t2-$t1)." s <br />"; 
  106. echo getendday2('2010-05-12',66,$exception)."<br />"; 
  107. $t3 = microtime();echo "use ".($t3-$t2)." s <br />"; 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表