两个值换成unix时间戳 跟着相减 得到之间的秒数....跟着除出天数.....

解决方案 »

  1.   

    貌似看了一下,觉得有点问题..
    2008-12-22 到 2008-12-29 有8天,
    可不包含周六和周日就只有六天,
    怎么会有六天呢? (6天或者5天)
    按你的意思肯定是一个星期加一天=8天,
    但加的那一天有可能是周日,那么就会出现2个周日和1个周六..这里需要考虑一下..代码不是关键,关键是思路...LZ的意思是不是如果是7天就减2天双休
    那么,8,9,....13,怎么算,也只算一个周日和一个周六?那么,14天就是2个周日和2个周六...
    $days = "日期相减得到的天数";if($days%7 ==1){
      $days = $days-2;
    return $days;
    }if($days%7 ==2){
      $days = $days-4;
    return $days;
    }
    ......依次类推
      

  2.   

    同意LS 我的思路就是跟不上啊,发现不了规律  呵呵 <?php
    $strStart = '2008-12-22';
    $strEnd = '2008-12-29';

    $timeStart = strtotime($strStart);
    $timeEnd = strtotime($strEnd);
    $total = $timeEnd-$timeStart;
    $out = 0;
    $oneDay = 24*60*60;
    //判断
    while(1)
    {
    $arrStart = getdate($timeStart);
    if($timeStart<=$timeEnd)
    {
    if($arrStart['wday']==0||$arrStart['wday']==6)
    {
    ++$out;
    }
    $timeStart += $oneDay;
    }
    else break;
    } if($total>0)
    {
    $total = $total - $out*$oneDay;
    $count = $total/$oneDay;
    }
    //echo $count;
    ?> 
      

  3.   

    谢谢3楼,
    就每遇周六或日都休假的意思,
    你上面的算法还可这样写:for(i=0;i<52;i++;){if($days%7 ==i){
      $days = $days-2i;
    return $days;
    }}可你怎么知道今天是星期几呢,
    要是今天是星期五,就是请四天中也会减二天呀,
    又应该如何处理呢,
      

  4.   

    呵呵,我的意思和你说的差不多...
    我写的那段代码是你理想化的情况下才能用到的..请假必须用星期一开始.考虑其他情况的话就必须用到
    date('l');//Sunday 到 Saturday
    来判断今天是星期几
    再用while()....case 来筛选
      

  5.   

    4楼的算法有误,
    我是要 每遇周六或日都休假的意思, 
    你的算法中我用了   
        $strStart = '2008-07-01';
        $strEnd = '2008-07-07';
    做测试,输出的是4,
    不对呀,应该5呀,
    你可能是没有判断好 星期几的问题,
    再帮我修改下,(2009-01-01是周四),
    时间都用09-01-01年以后的吧,
    谢谢
      

  6.   

    LZ 我的方法很乱吗,我只是笨笨的把所有日期拉出来判断下,应该都看的懂才对
    你最后if($total>0)
        {
            $total = $total+$oneday-$out*$oneDay;
            $count = $total/$oneDay;
        }试试
      

  7.   


    if($total>0)
        {
            $total = $total+$oneDay-$out*$oneDay;
            $count = $total/$oneDay;
        }
      

  8.   

    对了,
    就是这一天的问题。
    谢谢楼上的,
    加下小弟的MSN:
    [email protected]
      

  9.   


     发表于:2008-07-28 11:21:064楼 得分:0 
    同意LS 我的思路就是跟不上啊,发现不了规律  呵呵 PHP code
    <?php
        $strStart = '2008-12-22';
        $strEnd = '2008-12-29';
        
        $timeStart = strtotime($strStart);
        $timeEnd = strtotime($strEnd);
        $total = $timeEnd-$timeStart;
        //这里就应加一天,要不下面的判断就有问题if($total>0);
        
        $out = 0;
        $oneDay = 24*60*60;
        //判断
        while(1)
        {
            $arrStart = getdate($timeStart);
            if($timeStart<=$timeEnd)
            {
                if($arrStart['wday']==0||$arrStart['wday']==6)
                {
                    ++$out;
                }
                $timeStart += $oneDay;
            }
            else break;
        }    if($total>0)
        {
            $total = $total - $out*$oneDay;
            $count = $total/$oneDay;
        }
        //echo $count;
    ?>
      

  10.   

    公司不让上MSN,没办法,我住的地方又没电脑......
    郁闷/...
      

  11.   

    <?php
    function dif_date($start_date,$end_date){
       $start_ar=explode("-",$start_date);
       $end_ar=explode("-",$end_date);
       $start_time=mktime(0,0,0,$start_ar[1],$start_ar[2],$start_ar[0]);
       $end_time=mktime(0,0,0,$end_ar[1],$end_ar[2]+1,$end_ar[0]);
       $dif_time=$end_time-$start_time;
       $dif_days=ceil($dif_time/(24*60*60));
       
      $start_weekday=date("N",$start_time);
       
       $mod_val=$dif_days%7;
       $up_limit=$start_weekday+$mod_val;
       $other_dif=0;
       for($j=$start_weekday;$j<$up_limit;$j++){
          $tmp_val=$j%7;
          if($tmp_val==0 || $tmp_val==6){
           $other_dif++;
          }
       }
       $week_dif=(floor($dif_days/7))*2;
       
       $res_dif=$dif_days-$week_dif-$other_dif;
       return $res_dif;
    }$res_dif=dif_date("2008-7-1",'2008-7-31');
    echo $res_dif;
    ?>
      

  12.   

    如果我还有一函数
    function public_day($tsDate) 这函数(已封装好)
    用来得到国家 公共节假日,那在我上面的$total函数中,怎么减去这些假呀,
    <?php
        $strStart = '2008-12-22';
        $strEnd = '2008-12-29';
        
        $timeStart = strtotime($strStart);
        $timeEnd = strtotime($strEnd);
        $total = $timeEnd-$timeStart;
        $out = 0;
        $oneDay = 24*60*60;
          while(1)
        {
            $arrStart = getdate($timeStart);
            if($timeStart<=$timeEnd)
            {
                if($arrStart['wday']==0||$arrStart['wday']==6)
                {
                    ++$out;
                }
                $timeStart += $oneDay;
            }
            else break;
        }    if($total>0)
        {
            $total = $total+oneDay - $out*$oneDay;
            $count = $total/$oneDay;
        }
        //echo $count;
    ?>就在这代码上修改。。
    谢谢了。  
      

  13.   

    <?php 
        $strStart = '2008-12-22'; 
        $strEnd = '2008-12-29'; 
        
        $timeStart = strtotime($strStart); 
        $timeEnd = strtotime($strEnd); 
        $total = $timeEnd-$timeStart; 
        $out = 0; 
        $oneDay = 24*60*60; 
          while(1) 
        { 
            $arrStart = getdate($timeStart); 
            if($timeStart <=$timeEnd) 
            { 
                if($arrStart['wday']==0 ¦ ¦$arrStart['wday']==6) 
                { 
                    ++$out; 
                } 
                $timeStart += $oneDay; 
            } 
            else break; 
        }     if($total>0) 
        { 
            $total = $total+oneDay - $out*$oneDay; 
            $count = $total/$oneDay; 
        } 
        //echo $count; 
    ?> 
    这个函数得到的 $count 是去掉了双休的,
    只是还有些国家公共节假日没考虑,
    这function public_day($tsDate)是用来得到公共节假日的,
    可直接调用的函数,
    就是怎么把二个函数结合起来用,得到的天数中既没有双休,又没有公共节假日,天数也可算对,
      

  14.   

    不用,
    在这function public_day($tsDate)已都考虑好,
    只把这二函数连起来就行了,
      

  15.   

    你public_day得到的参数$tsDate是什么?返回的又是什么?
      

  16.   

    fuction  public_day{
       if((date('m',$tsDate)==1 && date('d',$tsDate)==1) || (date('m',$tsDate)==5 && (date('d',$tsDate)==1)) || date('m',$tsDate)==10 && (date('d',$tsDate)==1 || date('d',$tsDate)==2 || date('d',$tsDate)==3)){
    // 1-1  5-1 10-1 10-2 10-3
    return 0;
    上面是判断 1-1  5-1 10-1 10-2 10-3 放假 ,其它的与这个同理,$tsDate就是date('m',$tsDate)中的 $tsDate,返回值都是0 或1,在其它地方这样调用,成功过:
    $cur_date=strtotime($start_date);
    $i=1;
    while($i<=$days){
    if($this->public_day($cur_date)){
    if($i==1)
    $start_date=date("Y-m-d",$cur_date);
    $i++;
      

  17.   


    if(!public_day($timeStart)||$arrStart['wday']==0 ||$arrStart['wday']==6) 
      

  18.   

    六道之纹
    可以写下你的MSN吗,
    加我的也可以,
    [email protected]
    注明CSDN
    谢谢你。
      

  19.   

    刚开始学PHP,所以代码上面没办法帮忙,只能说说我的思路
    假设每周从周一开始,周日结束(data函数应该能取得1-7的表示星期几的数字)
    首先算出时间差的天数以及开始的星期数,然后规整去头,也就是将下个周一前的天数去掉,着就变成包含一个双休的一段时间
    然后将剩余的天数用7取整取余后分成2段,一段是包含完整7天的周数X(取整后舍弃小数),一段是最后不完整的一周天数Y(也可能取整后没有余数)
    最后将计算中的双休天数,如果Y>5的话,说明最后包含双休的天数,2+X*2+(Y-5),否则2+X*2(忽略Y)
      

  20.   

    尝试写了下,不知道可以不可以,基本没用什么流程控制的代码,就一个IF判断,应该是很简单吧....
    <?php //起止时间
    $strStart = '2008-12-22';
        $strEnd = '2008-12-29';
        $out = 0; //计算日期差
        $timeStart = strtotime($strStart);
        $timeEnd = strtotime($strEnd);
        $total = $timeEnd-$timeStart;
        echo "日期间相差 $total 秒<br />";    $oneDay = 24*60*60;
    $total=$total/$oneDay+1;
    echo "日期间相差 $total 天<br />";

    //起始日期的星期数,周一起算1-7
    $WeekDay=date(N,$timeStart);
    echo "起始日期星期 $WeekDay<br />";

    //以周日为结束,起始日期所在周的天数
    $firstDays=8-$WeekDay;
    echo "第一周天数 $firstDays<br />";

    //祛除首周后的剩余天数
    $out=$total-$firstDays;

    //周一至周日完整周数
    $Weeks=($out-$out%7)/7;
    echo "剩余完整周数量 $Weeks<br />";

    //最后一个不完整周的天数
    $other=$out%7;
    echo "最后周天数 $other<br />"; //计算总假日数,不包括非双休假日
    $Holiday=2+ $Weeks*2;
    if($other>5)
    $Holiday += 2;

    echo "双休假日总天数 $Holiday<br />";

    //日期差天数减去假日天数
    $total=$total-$Holiday;
    echo "非双休日数 $total<br />";

    ?> 
      

  21.   

    <?php
    $start_date = "2008-10-12";
    $end_date = "2008-12-10";function getWorkDate($start, $end){
    $result[0] = 0;
    while($start < $end){
    $week = date("w", strtotime($start));
    if($week > 0 && $week < 6){
    $result[0] ++;
    $result[] = $start;
    }
    $start = date("Y-m-d", strtotime($start) + 3600 * 24);

    } return $result;
    }print_r(getWorkDate($start_date, $end_date));
    ?>如果2008-12-10 到2008-12-11 算一天就用上边方法,如果算两天就把$start < $end 改为 $start <= $end
      

  22.   

    我的MSN:[email protected]
    不常用MSN
    我也在学,一起努力吧