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

时间:2010-05-26 12:51:33

标签: php datetime

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

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 个答案:

答案 0 :(得分:2)

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