2010-05-26 3 views
-1

У меня есть два пользователя в моей базе данных, чья дата рождения устанавливаются на:PHP: Странная проблема Даты

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, правильный результат показан.

Примечание: Вы можете проверить функцию самостоятельно.

Не могли бы вы рассказать, что может быть неправильным там, ваша помощь будет высоко оценена.

Спасибо.

+0

FFS, используйте имена переменных, которые на самом деле что-то означают. Неудивительно, что вы застряли. –

ответ

2

1 января 1970 - это то, что вы получаете с отметкой времени unix 0/неверной датой. Вы уверены, что данные в базе данных точны?

+0

Да, данные абсолютно правильны и одинаковы для этих двух пользователей. – Sarfraz

+0

Что делать, если вы вынуждаете все числа целыми числами? Там ДОЛЖНО быть разница. Попробуйте это, он сломает скрипт: print_r (retage (1985, «01», 26)); – CharlesLeaf

+0

Отлично, он сломал его, как его решить сейчас? – 2010-05-26 13:40:18

Смежные вопросы