Какова самая точная функция, с которой вы столкнулись, чтобы определить возраст от даты рождения. У меня есть следующий код, и мне было интересно, как его можно улучшить, поскольку он не поддерживает все форматы дат и не уверен, что это самая точная функция (соответствие даты и времени было бы приятным).
function getAge($birthday) { return floor((strtotime(date('dm-Y')) - strtotime($date))/(60*60*24*365.2421896)); }
$birthday = new DateTime($birthday); $interval = $birthday->diff(new DateTime); echo $interval->y;
Должно сработать
Проверь это
<?php $c= date('Y'); $y= date('Y',strtotime('1988-12-29')); echo $c-$y; ?>
Попробуйте использовать DateTime для этого:
$now = new DateTime(); $birthday = new DateTime('1973-04-18 09:48:00'); $interval = $now->diff($birthday); echo $interval->format('%y years'); // 39 years
Смотрите это в действии
Используйте этот код, чтобы иметь полный возраст, включая годы, месяцы и дни,
<?php //full age calulator $bday = new DateTime('02.08.1991');//dd.mm.yyyy $today = new DateTime('00:00:00'); // Current date $diff = $today->diff($bday); printf('%d years, %d month, %d days', $diff->y, $diff->m, $diff->d); ?>
Это работает:
<? $date = date_create('1984-10-26'); $interval = $date->diff(new DateTime); echo $interval->y; ?>
Если вы скажете мне, в каком формате придет ваша переменная $birthday
я дам вам точное решение
WTF?
StrToTime (дата ( 'ого-Y'))
Итак, вы генерируете строку даты из текущей временной метки, а затем преобразуете строку даты обратно в метку времени?
Кстати, одна из причин, по которой он не работает, заключается в том, что strtotime () предполагает, что числовые даты должны быть в формате m / d / y (т.е. формат даты в США). Другая причина заключается в том, что параметр ($ birthday) не используется в формуле.
Измените $date
на $birthday
.
Для точности ужина вам нужно учитывать коэффициент високосного года:
function get_age($dob_day,$dob_month,$dob_year){ $year = gmdate('Y'); $month = gmdate('m'); $day = gmdate('d'); //seconds in a day = 86400 $days_in_between = (mktime(0,0,0,$month,$day,$year) - mktime(0,0,0,$dob_month,$dob_day,$dob_year))/86400; $age_float = $days_in_between / 365.242199; // Account for leap year $age = (int)($age_float); // Remove decimal places without rounding up once number is + .5 return $age; }
Поэтому используйте:
echo get_date(31,01,1985);
или что-то еще …
NB Чтобы увидеть ваш точный возраст до десятичного
return $age_float
вместо.
Эта функция работает нормально.
function age($birthday){ list($day,$month,$year) = 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 ($day_diff < 0 && $month_diff < 0){$year_diff--;} return $year_diff; }
Посмотреть сообщение BLOG Post
вот моя длинная / подробная версия (вы можете сделать ее короче, если хотите):
$timestamp_birthdate = mktime(9, 0, 0, $birthdate_month, $birthdate_day, $birthdate_year); $timestamp_now = time(); $difference_seconds = $timestamp_now-$timestamp_birthdate; $difference_minutes = $difference_seconds/60; $difference_hours = $difference_minutes/60; $difference_days = $difference_hours/24; $difference_years = $difference_days/365;
что, я опаздываю, чтобы ответить? : D