PHP вычисляет возраст

Я ищу способ рассчитать возраст человека, учитывая их DOB в формате dd / mm / yyyy.

Я использовал следующую функцию, которая работала нормально в течение нескольких месяцев, пока какой-то глюк не заставил цикл while никогда не кончать и не остановил весь сайт. Поскольку почти 100 000 DOB, проходящих эту функцию несколько раз в день, трудно определить, что вызвало это.

У кого-нибудь есть более надежный способ расчета возраста?

//replace / with - so strtotime works $dob = strtotime(str_replace("/","-",$birthdayDate)); $tdate = time(); $age = 0; while( $tdate > $dob = strtotime('+1 year', $dob)) { ++$age; } return $age; 

EDIT: эта функция работает нормально некоторое время, но возвращает «40» для DOB 14/09/1986

 return floor((time() - strtotime($birthdayDate))/31556926); 

Это прекрасно работает.

 <?php //date in mm/dd/yyyy format; or it can be in other formats as well $birthDate = "12/17/1983"; //explode the date to get month, day and year $birthDate = explode("/", $birthDate); //get age from date or birthdate $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md") ? ((date("Y") - $birthDate[2]) - 1) : (date("Y") - $birthDate[2])); echo "Age is:" . $age; ?> 
 $tz = new DateTimeZone('Europe/Brussels'); $age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz) ->diff(new DateTime('now', $tz)) ->y; 

Начиная с PHP 5.3.0 вы можете использовать удобный DateTime::createFromFormat чтобы гарантировать, что ваша дата не ошибается для формата m/d/Y и класса DateInterval (через DateTime::diff ), чтобы получить количество лет между ними и целевую дату.

  $date = new DateTime($bithdayDate); $now = new DateTime(); $interval = $now->diff($date); return $interval->y; 

Для этого я использую Date / Time:

 $age = date_diff(date_create($bdate), date_create('now'))->y; 

Простой метод расчета Age from dob:

 $_age = floor((time() - strtotime('1986-09-16')) / 31556926); 

31556926 – это количество секунд в году.

Я считаю, что это работает и прост.

Вычитайте из 1970, потому что strtotime вычисляет время с 1970-01-01 ( http://php.net/manual/en/function.strtotime.php )

 function getAge($date) { return intval(date('Y', time() - strtotime($date))) - 1970; } 

Результаты:

 Current Time: 2015-10-22 10:04:23 getAge('2005-10-22') // => 10 getAge('1997-10-22 10:06:52') // one 1s before => 17 getAge('1997-10-22 10:06:50') // one 1s after => 18 getAge('1985-02-04') // => 30 getAge('1920-02-29') // => 95 

// Возрастной калькулятор

 function getAge($dob,$condate){ $birthdate = new DateTime(date("Ymd", strtotime(implode('-', array_reverse(explode('/', $dob)))))); $today= new DateTime(date("Ymd", strtotime(implode('-', array_reverse(explode('/', $condate)))))); $age = $birthdate->diff($today)->y; return $age; } $dob='06/06/1996'; //date of Birth $condate='07/02/16'; //Certain fix Date of Age echo getAge($dob,$condate); 

Если вы хотите сгладить Age of the dob, вы также можете использовать эту функцию. Он использует объект DateTime.

 function calcutateAge($dob){ $dob = date("Ymd",strtotime($dob)); $dobObject = new DateTime($dob); $nowObject = new DateTime(); $diff = $dobObject->diff($nowObject); return $diff->y; } 

Понял, что я брошу это здесь, потому что это, кажется, самая популярная форма этого вопроса.

Я провел 100-летнее сравнение на 3 из самых популярных типов возрастных функций, которые я мог найти для PHP, и опубликовал мои результаты (а также функции) в своем блоге .

Как вы можете видеть там , все 3 функции хорошо забивают с небольшим разницей во второй функции. Мое предложение, основанное на моих результатах, заключается в использовании третьей функции, если вы не хотите делать что-то конкретное в день рождения человека, и в этом случае первая функция обеспечивает простой способ сделать именно это.

Обнаружена небольшая проблема с тестом, а другая проблема со вторым методом! Обновление скоро появится в блоге! На данный момент, я бы отметил, второй метод по-прежнему является самым популярным, который я нахожу в Интернете, и тем не менее тем самым я нахожу самые неточности!

Мои предложения после моего 100-летнего обзора:

Если вы хотите что-то более удлиненное, чтобы вы могли включать случаи, такие как дни рождения и т.

 function getAge($date) { // Ymd format $now = explode("-", date('Ym-d')); $dob = explode("-", $date); $dif = $now[0] - $dob[0]; if ($dob[1] > $now[1]) { // birthday month has not hit this year $dif -= 1; } elseif ($dob[1] == $now[1]) { // birthday month is this month, check day if ($dob[2] > $now[2]) { $dif -= 1; } elseif ($dob[2] == $now[2]) { // Happy Birthday! $dif = $dif." Happy Birthday!"; }; }; return $dif; } getAge('1980-02-29'); 

Но если вы просто хотите узнать возраст и ничего больше, тогда:

 function getAge($date) { // Ymd format return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4)); } getAge('1980-02-29'); 

См. БЛОГ


Ключевое примечание о методе strtotime :

 Note: Dates in the m/d/y or dmy formats are disambiguated by looking at the separator between the various components: if the separator is a slash (/), then the American m/d/y is assumed; whereas if the separator is a dash (-) or a dot (.), then the European dmy format is assumed. If, however, the year is given in a two digit format and the separator is a dash (-, the date string is parsed as ymd. To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or DateTime::createFromFormat() when possible. 
  function dob ($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--; return $year_diff; } 

Если вам не нужна большая точность, просто количество лет, вы можете рассмотреть использование кода ниже …

  print floor((time() - strtotime("1971-11-20")) / (60*60*24*365)); 

Вам нужно только включить это в функцию и заменить дату «1971-11-20» на переменную.

Обратите внимание, что точность приведенного выше кода невелика из-за високосных лет, то есть примерно каждые 4 года дни составляют 366 вместо 365. Выражение 60 * 60 * 24 * 365 вычисляет количество секунд в году – вы можете замените его на 31536000.

Еще одна важная вещь заключается в том, что из-за использования временной отметки UNUX у нее есть как проблема 1901 года, так и год 2038 года, что означает, что приведенное выше выражение не будет работать правильно для дат до 1901 года и после 2038 года.

Если вы можете жить с ограничениями, упомянутыми выше, этот код должен работать на вас.

Я нашел этот сценарий надежным. Он принимает формат даты как YYYY-mm-dd, но его можно легко изменить для других форматов.

 /* * Get age from dob * @param dob string The dob to validate in mysql format (yyyy-mm-dd) * @return integer The age in years as of the current date */ function getAge($dob) { //calculate years of age (input string: YYYY-MM-DD) list($year, $month, $day) = explode("-", $dob); $year_diff = date("Y") - $year; $month_diff = date("m") - $month; $day_diff = date("d") - $day; if ($day_diff < 0 || $month_diff < 0) $year_diff--; return $year_diff; } 
 $birthday_timestamp = strtotime('1988-12-10'); // Calculates age correctly // Just need birthday in timestamp $age = date('md', $birthday_timestamp) > date('md') ? date('Y') - date('Y', $birthday_timestamp) - 1 : date('Y') - date('Y', $birthday_timestamp); 

i18n:

 function getAge($birthdate, $pattern = 'eu') { $patterns = array( 'eu' => 'd/m/Y', 'mysql' => 'Ym-d', 'us' => 'm/d/Y', ); $now = new DateTime(); $in = DateTime::createFromFormat($patterns[$pattern], $birthdate); $interval = $now->diff($in); return $interval->y; } // Usage echo getAge('05/29/1984', 'us'); // return 28 

это моя функция для вычисления DOB с конкретным возвратом возраста к году, месяцу и дню

 function ageDOB($y=2014,$m=12,$d=31){ /* $y = year, $m = month, $d = day */ date_default_timezone_set("Asia/Jakarta"); /* can change with others time zone */ $ageY = date("Y")-intval($y); $ageM = date("n")-intval($m); $ageD = date("j")-intval($d); if ($ageD < 0){ $ageD = $ageD += date("t"); $ageM--; } if ($ageM < 0){ $ageM+=12; $ageY--; } if ($ageY < 0){ $ageD = $ageM = $ageY = -1; } return array( 'y'=>$ageY, 'm'=>$ageM, 'd'=>$ageD ); } 

это как его использовать

 $ age = ageDOB (1984,5,8);  / * с моим местным временем 2014-07-01 * /
 echo sprintf ("age =% d years% d months% d days", $ age ['y'], $ age ['m'], $ age ['d']);  / * выход -> возраст = 29 год 1 месяц 24 день * /
 //replace / with - so strtotime works $dob = strtotime(str_replace("/","-",$birthdayDate)); $tdate = time(); return date('Y', $tdate) - date('Y', $dob); 

Если вы не можете использовать некоторые из новых функций, вот что я взломал. Вероятно, больше, чем вам нужно, и я уверен, что есть лучшие способы, но их легко читать, поэтому он должен выполнять эту работу:

 function get_age($date, $units='years') { $modifier = date('n') - date('n', strtotime($date)) ? 1 : (date('j') - date('j', strtotime($date)) ? 1 : 0); $seconds = (time()-strtotime($date)); $years = (date('Y')-date('Y', strtotime($date))-$modifier); switch($units) { case 'seconds': return $seconds; case 'minutes': return round($seconds/60); case 'hours': return round($seconds/60/60); case 'days': return round($seconds/60/60/24); case 'months': return ($years*12+date('n')); case 'decades': return ($years/10); case 'centuries': return ($years/100); case 'years': default: return $years; } } 

Пример использования:

 echo 'I am '.get_age('September 19th, 1984', 'days').' days old'; 

Надеюсь это поможет.

Из-за високосного года нецелесообразно просто вычитать одну дату от другой и довести ее до нескольких лет. Чтобы рассчитать возраст, подобный людям, вам понадобится нечто подобное:

 $birthday_date = '1977-04-01'; $age = date('Y') - substr($birthday_date, 0, 4); if (strtotime(date('Ym-d')) - strtotime(date('Y') . substr($birthday_date, 4, 6)) < 0) { $age--; } 

Следующие работы отлично подходят для меня и, кажется, намного проще, чем примеры, которые уже были даны.

 $dob_date = "01"; $dob_month = "01"; $dob_year = "1970"; $year = gmdate("Y"); $month = gmdate("m"); $day = gmdate("d"); $age = $year-$dob_year; // $age calculates the user's age determined by only the year if($month < $dob_month) { // this checks if the current month is before the user's month of birth $age = $age-1; } else if($month == $dob_month && $day >= $dob_date) { // this checks if the current month is the same as the user's month of birth and then checks if it is the user's birthday or if it is after it $age = $age; } else if($month == $dob_month && $day < $dob_date) { //this checks if the current month is the user's month of birth and checks if it before the user's birthday $age = $age-1; } else { $age = $age; } 

Я тестировал и активно использовал этот код, это может показаться немного громоздким, но его очень просто использовать, редактировать и довольно точно.

Следуя первой логике, вы должны использовать = в сравнении.

 <?php function age($birthdate) { $birthdate = strtotime($birthdate); $now = time(); $age = 0; while ($now >= ($birthdate = strtotime("+1 YEAR", $birthdate))) { $age++; } return $age; } // Usage: echo age(implode("-",array_reverse(explode("/",'14/09/1986')))); // format yyyy-mm-dd is safe! echo age("-10 YEARS") // without = in the comparison, will returns 9. ?> 

Это проблема, когда вы используете strtotime с DD / MM / YYYY. Вы не можете использовать этот формат. Вместо этого вы можете использовать MM / DD / YYYY (или многие другие, такие как YYYYMMDD или YYYY-MM-DD), и он должен работать правильно.

Как насчет запуска этого запроса и расчета MySQL MySQL для вас:

 SELECT username ,date_of_birth ,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) DIV 12 AS years ,(PERIOD_DIFF( DATE_FORMAT(CURDATE(), '%Y%m') , DATE_FORMAT(date_of_birth, '%Y%m') )) MOD 12 AS months FROM users 

Результат:

 r2d2, 1986-12-23 00:00:00, 27 , 6 

Пользователь имеет 27 лет и 6 месяцев (он насчитывает целый месяц)

Я сделал это так.

 $geboortedatum = 1980-01-30 00:00:00; echo leeftijd($geboortedatum) function leeftijd($geboortedatum) { $leeftijd = date('Y')-date('Y', strtotime($geboortedatum)); if (date('m')<date('m', strtotime($geboortedatum))) $leeftijd = $leeftijd-1; elseif (date('m')==date('m', strtotime($geboortedatum))) if (date('d')<date('d', strtotime($geboortedatum))) $leeftijd = $leeftijd-1; return $leeftijd; } 

Самый верный ответ для этого в порядке, но только в календаре в год, когда человек родился, я настраивал его для своих целей, чтобы выработать день и месяц. Но подумал, что стоит поделиться.

Это работает, взяв временную метку пользователя DOB, но не стесняйтесь изменять это

 $birthDate = date('dm-Y',$usersDOBtimestamp); $currentDate = date('dm-Y', time()); //explode the date to get month, day and year $birthDate = explode("-", $birthDate); $currentDate = explode("-", $currentDate); $birthDate[0] = ltrim($birthDate[0],'0'); $currentDate[0] = ltrim($currentDate[0],'0'); //that gets a rough age $age = $currentDate[2] - $birthDate[2]; //check if month has passed if($birthDate[1] > $currentDate[1]){ //user birthday has not passed $age = $age - 1; } else if($birthDate[1] == $currentDate[1]){ //check if birthday is in current month if($birthDate[0] > $currentDate[0]){ $age - 1; } } echo $age; 

Если вы хотите, чтобы вы становились полностью моложе, это очень простой способ сделать это. обрабатывать даты, отформатированные как «YYYYMMDD», как цифры и вычесть их. После этого отмените часть MMDD, разделив результат на 10000 и опустив его. Простой и никогда не сбой, даже требуется учитывать учетные данные и текущее время сервера;)

С момента рождения или в основном обеспечены полными датами по месту рождения, и они имеют отношение к ТЕКУЩЕМУ МЕСТНОМУ ВРЕМЕНИ (когда фактическая проверка действительно выполняется).

 $now = date['Ymd']; $birthday = '19780917'; #september 17th, 1978 $age = floor(($now-$birtday)/10000); 

поэтому, если вы хотите проверить, не является ли кто-то 18 или 21 или ниже 100 в вашем часовом поясе (не зря часовой пояс происхождения) к дню рождения, это мой способ сделать это

Эта функция вернет возраст в годах. Входное значение – день рождения (ГГГГ-ММ-ДД) дня рождения, например: 2000-01-01

Он работает с дневной точностью

 function getAge($dob) { //calculate years of age (input string: YYYY-MM-DD) list($year, $month, $day) = explode("-", $dob); $year_diff = date("Y") - $year; $month_diff = date("m") - $month; $day_diff = date("d") - $day; // if we are any month before the birthdate: year - 1 // OR if we are in the month of birth but on a day // before the actual birth day: year - 1 if ( ($month_diff < 0 ) || ($month_diff === 0 && $day_diff < 0)) $year_diff--; return $year_diff; } 

Cheers, nira

Самое простое решение – использовать PHP Carbon который является расширением API для DateTime (см. http://carbon.nesbot.com/docs/#api-difference ).

Всего за две строки вы получите то, что хотите:

 function calculate_age($date) { $date = new \Carbon\Carbon( $date ); return intval( $date->diffInYears() ); } 

Чистый и простой.

Попробуй это :

 <?php $birth_date = strtotime("1988-03-22"); $now = time(); $age = $now-$birth_date; $a = $age/60/60/24/365.25; echo floor($a); ?> 

Я использую следующий метод для расчета возраста:

 $oDateNow = new DateTime(); $oDateBirth = new DateTime($sDateBirth); // New interval $oDateIntervall = $oDateNow->diff($oDateBirth); // Output echo $oDateIntervall->y; 

вот простая функция для расчета возраста:

 <?php function age($birthDate){ //date in mm/dd/yyyy format; or it can be in other formats as well //explode the date to get month, day and year $birthDate = explode("/", $birthDate); //get age from date or birthdate $age = (date("md", date("U", mktime(0, 0, 0, $birthDate[0], $birthDate[1], $birthDate[2]))) > date("md") ? ((date("Y") - $birthDate[2]) - 1) : (date("Y") - $birthDate[2])); return $age; } ?> <?php echo age('11/05/1991'); ?>