2015-03-28 6 views
-1

Я использую следующую функцию для расчета возраста с данной даты рождения, но не показывает правильную разницу, если используется день високосного года, то есть 29. Пожалуйста, помогите мне исправить этот код.Возрастная ошибка високосного года в php

<?php 
function getAbsAge($birthday) 
    { 
     list($year,$month,$day) = explode("-", $birthday); 
     $year_diff = date("Y") - $year; 
     $month_diff = date("m") - $month; 
     $day_diff = date("d") - $day; 

     if ($day_diff < 0 || $month_diff < 0) 
     { 
      $year_diff--; 
     } 

     if ($year_diff == 0) 
     { 
      $interval = date_diff(date_create(), date_create($birthday)); 
      $months = $interval->format("%M"); 
      $days = $interval->format("%d"); 

      if ($months > 0) 
      { 
       return $interval->format("%M Months %d Days"); 
      } 
      else if ($months == 0 && $days > 1) 
      { 
       return $interval->format("%d Days"); 
      } 
      else 
      { 
       return $interval->format("%d Day"); 
      } 
     } 
     else if ($year_diff == 1) 
     { 
     return "$year_diff Year"; 
    } 
     else if ($year_diff > 1) 
     { 
     return "$year_diff Years"; 
    } 
    } 
echo getAbsAge("2012-02-29") 
?> 

Также, если кто-нибудь может предложить лучший код, пожалуйста, обновите его.

Мне нужно найти дату рождения в месяцах и днях, если человек меньше 1 года.

У меня есть последняя версия версии 5.0 на моем сервере.

С 2012-02-29, его возвращение 2 года, тогда как это должно быть 3 года. Пожалуйста помоги.

+0

Может быть, вы найдете [это] (http://stackoverflow.com/questions/676824/how-to-calculate-the -difference-between-two-date-using-php) helpfpul. – mrun

ответ

1

Почему вы не используете функцию date_diff() до конца? это даст вам желаемый результат:

function getAbsAge($birthday) { 

    $age = ''; 
    $diff = date_diff(date_create(), date_create($birthday)); 
    $years = $diff->format("%y"); 
    $months = $diff->format("%m"); 
    $days = $diff->format("%d"); 

    if ($years) { 
     $age = ($years < 2) ? '1 Year' : "$years Years"; 
    } else { 
     $age = ''; 
     if ($months) $age .= ($months < 2) ? '1 Month ' : "$months Months "; 
     if ($days) $age .= ($days < 2) ? '1 Day' : "$months Days"; 
    } 
    return trim($age); 
} 

Другим способом было бы путем расчета разницы во времени в секундах и принимать его оттуда:

list($year,$month,$day) = explode("-", $birthday); 
$diff = mktime(0,0,0,date('n'),date('j'),date('Y')) - mktime(0,0,0,$month,$day,$year); 

Затем в день состоит из 24 часов каждый 60 минут каждый 60 секунд:

$sday = 60 * 60 * 24; 

, а затем вычисления разницы лет будет:

$years = floor($diff/(365.2425 * $sday));  

Но я бы просто придерживаться первой версии я представил вам с помощью date_diff()