要求:可以指定开始日期,经过一定天数(比如3-5天),计算出结束日期。难点:周末和节假日必须排除在经过天数之外。比如8月27日(周4)开始,经过3天,本来应该是8月30日结束;但是8月29日是周6,8月30日是周日,这两天得排除,这样8月27日开始,经过3天,得出的结束时间应该是9月1日。用函数、对象或是其他方式实现都可以。分不多,还希望各位大侠不吝赐教。

解决方案 »

  1.   

    $start="2009-1-1";
    $days=30;  //指定天数
    $wantDays=0; //实际天数(周末除外)
    for($i=1;$i<=$days;$i++){
      $nowDay_time=strtotime($start)+$i*86400;
      if(date(w,$nowDay_time)!=5 && date(w,$nowDay_time)!=6) $wantDays++;
    }
    $end=date('Y-m-d',(strtotime($start)+$wantDays*86400));
    echo $end;
    直接手写的,自己测试下吧
      

  2.   


    // 调用  c('2009-8-31', 15, $j);
    // 节假日定义格式为
    /* array('有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....]),
             '有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....])
             [, .....])
    */
    // 参数说明 c(开始日期,需要计算的天数,节假日列表)
    function c($start, $day=0, $j=array()){
        $start = strtotime( $start );
        $day   = intval( $day < 1 );
        if( $start < 1 || $day < 1 ) return 0;
        $reday = 0;
        for($i=0; $i<$day; $i++){
            $temp  = array(date('n', $start), date('j', $start));
            $temp[]= isset($j[ $temp[0] ]) And in_array($temp[1], $j[ $temp[0] ]);
            if( 0<>date(w,$nowDay_time) And 6<>date(w,$nowDay_time) And !$temp[2] ){
                $reday++;
            }
            $start += 3600*24;
        }
        unset( $start, $day, $j, $i, $temp );
        return $reday;
    }
      

  3.   

    刚刚发现,直接复制搞错一个地方,改过来
    // 调用  c('2009-8-31', 15, $j);
    // 节假日定义格式为
    /* array('有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....]),
             '有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....])
             [, .....])
    */
    // 参数说明 c(开始日期,需要计算的天数,节假日列表)
    function c($start, $day=0, $j=array()){
        $start = strtotime( $start );
        $day   = intval( $day );
        if( $start < 1 || $day < 1 ) return 0;
        $reday = 0;
        for($i=0; $i<$day; $i++){
            $temp  = array(date('n', $start), date('j', $start));
            $temp[]= isset($j[ $temp[0] ]) And in_array($temp[1], $j[ $temp[0] ]);
            if( 0<>date(w,$nowDay_time) And 6<>date(w,$nowDay_time) And !$temp[2] ){
                $reday++;
            }
            $start += 3600*24;
        }
        unset( $start, $day, $j, $i, $temp );
        return $reday;
    }
      

  4.   

    晕,
    // 调用  c('2009-8-31', 15, $j);
    // 节假日定义格式为
    /* array('有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....]),
             '有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....])
             [, .....])
    */
    // 参数说明 c(开始日期,需要计算的天数,节假日列表)
    function c($start, $day=0, $j=array()){
        $start = strtotime( $start );
        $day   = intval( $day < 1 );
        if( $start < 1 || $day < 1 ) return 0;
        $reday = 0;
        for($i=0; $i<$day; $i++){
            $temp  = array(date('n', $start), date('j', $start));
            $temp[]= isset($j[ $temp[0] ]) And in_array($temp[1], $j[ $temp[0] ]);
            if( 0<>date('w',$start) And 6<>date('w',$start) And !$temp[2] ){
                $reday++;
            }
            $start += 3600*24;
        }
        unset( $start, $day, $j, $i, $temp );
        return $reday;
    }