代码之家  ›  专栏  ›  技术社区  ›  Sarfraz

PHP日期计算中出现意外结果

  •  -1
  • Sarfraz  · 技术社区  · 16 年前

    我的数据库中有两个用户的出生日期设置为:

    1985-01-26
    

    然后我有一个函数,当提供了用户的日期,告诉多少天剩下的生日。函数如下:

    function retage($iy,$im,$id)
    {
        if(!empty($iy)>0 && intval($im)>0 && intval($id)>0)
        {
            $tdo=$iy.'-'.$im.'-'.$id;
             $tdc=date('Y').'-'.$im.'-'.$id;
            /*echo "<br/>";*/
             $cd=date('Y-n-j');
            /*echo "<br/>";*/
            if(strtotime($tdc)>strtotime($cd))//coming
            {
                $ty=floor((strtotime($tdc)-strtotime($tdo))/(3600*24*365));
                $td=floor((strtotime($tdc)-strtotime($cd))/(24*3600));
                if($td==1)
                {
                    $td=round((strtotime($tdc)-strtotime($cd))/(24*3600)).' day to go';
                }
                else
                {
                    $td=round((strtotime($tdc)-strtotime($cd))/(24*3600)).' days to go';
                }
                $ty='<font color="#C7C5C5">is turning '.$ty.' on <br>'.date('M jS Y',strtotime($tdc)).'</font>';
                //return 'is turning '.$ty.' on '.$tdc;
            }
            elseif(strtotime($tdc)<strtotime($cd))//past
            {
                $ty=floor((strtotime($tdc)-strtotime($tdo))/(3600*24*365));
                if($ty>0)
                {
                    //$td='gone '.floor((strtotime($cd)-strtotime($tdc))/(24*3600)).' days ago';
    
                    $ndays=floor((strtotime($cd)-strtotime($tdc))/(24*3600));
    
                    if($ndays==1)
                        $td=' gone '.round((strtotime($cd)-strtotime($tdc))/(24*3600)).' day ago';
                    else
                        $td=' gone '.round((strtotime($cd)-strtotime($tdc))/(24*3600)).' days ago'; 
    
                    $ty='<font color="#C7C5C5">had turned '.$ty.' on <br>'.date('M jS Y',strtotime($tdc)).'</font>';
                    //return 'had turned '.$ty.' on '.$tdc;
                }
                else
                {
                    $tdc=(date('Y')+1).'-'.$im.'-'.$id;
                    $ty=floor((strtotime($tdc)-strtotime($tdo))/(3600*24*365));
                    //$td=floor((strtotime($tdc)-strtotime($cd))/(24*3600)).' days to go';
                    $td=floor((strtotime($tdc)-strtotime($cd))/(24*3600));
                    if($td==1)
                    {
                        $td=round((strtotime($tdc)-strtotime($cd))/(24*3600)).' day to go';
                    }
                    else
                    {
                        $td=round((strtotime($tdc)-strtotime($cd))/(24*3600)).' days to go';
                    }
    
                    $ty='<font color="#C7C5C5">is turning '.$ty.' on <br>'.date('M jS Y',strtotime($tdc)).'</font>';
                    //return 'is turning '.$ty.' on '.$tdc;
                }
            }
            else//today
            {
                $ty=floor((strtotime($tdc)-strtotime($tdo))/(3600*24*365));
                if($ty>0)
                {
                    $td='today';
                    $ty='<font color="#C7C5C5">has turned <br>'.$ty.' on today </font>';
                    //return 'has turned '.$ty.' on today';
                }
                else
                {
                    $ty='<font color="#C7C5C5">today</font>';$td='';
                    //return '';
                }
            }
        }
        else
        {
            $ty='';$td='';
            //return '';
        }
        $ta[0]=$ty;
        $ta[1]=$td  ;
        return $ta;
    }
    

    while($rs=mysql_fetch_array($result))
    {
    if (isset($rs['byear'],$rs['bmonth'],$rs['bdate']))
      {
        $tmptxt = retage($rs['byear'],$rs['bmonth'],$rs['bdate']);
        echo $tmptxt[1];
      }
    }
    

    奇怪的是,对于一个用户来说,剩余的天数是正确显示的,例如:

    gone 120 days ago
    

    Jan 1st 1970  -14755 days to go
    

    奇怪:

    1985-01-26 ,显示了正确的结果。

    这里可能有什么问题?

    1 回复  |  直到 8 年前
        1
  •  2
  •   CharlesLeaf    16 年前

    1970年1月1日是unix时间戳为0/无效日期的结果。你确定数据库里的数据是准确的吗?