В PHP вычислить возраст
Я ищу способ рассчитать возраст человека, учитывая их DOB в формате dd/mm / yyyy.
я использовал следующую функцию, которая работала нормально в течение нескольких месяцев, пока какой-то сбой не заставил цикл while никогда не заканчиваться и не остановил весь сайт. Поскольку через эту функцию несколько раз в день проходит почти 100 000 Добов, трудно определить, что было причиной этого.
есть ли у кого-нибудь более надежный способ расчета возраст?
//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);
30 ответов
Это прекрасно работает.
<?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
чтобы ваша дата не была ошибочно принята за и DateInterval
класса (через DateTime::diff
), чтобы получить количество лет между настоящим моментом и целевой датой.
$date = new DateTime($bithdayDate);
$now = new DateTime();
$interval = $now->diff($date);
return $interval->y;
простой метод расчета возраста от 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("Y-m-d", strtotime(implode('-', array_reverse(explode('/', $dob))))));
$today= new DateTime(date("Y-m-d", 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);
Если вы хотите вычислить возраст использования dob, вы также можете использовать эту функцию. Он использует объект DateTime.
function calcutateAge($dob){
$dob = date("Y-m-d",strtotime($dob));
$dobObject = new DateTime($dob);
$nowObject = new DateTime();
$diff = $dobObject->diff($nowObject);
return $diff->y;
}
подумал, что я бы бросил это здесь, так как это, кажется, самая популярная форма этого вопроса.
Я провел 100-летнее сравнение 3 самых популярных типов возрастных функций, которые я мог найти для PHP, и опубликовал свои результаты (а также функции) в мой блог.
Как видите,здесь, все 3 нам библиотеки и функции преформ с небольшой разницей по 2-й функции. Мое предложение, основанное на моих результатах, - использовать 3-ю функцию, если вы не хотите сделайте что-то конкретное в день рождения человека, и в этом случае 1-я функция обеспечивает простой способ сделать именно это.
найдена небольшая проблема с тестом, и еще одна проблема с 2-м методом! Обновление в блоге! На данный момент я бы отметил, что 2-й метод по-прежнему самый популярный, который я нахожу в интернете, и все же я нахожу самые неточности!
мои предложения после моего 100-летнего обзора:
если вы хотите что-то более вытянутое, чтобы вы могли включать такие случаи, как дни рождения и такие:
function getAge($date) { // Y-m-d format
$now = explode("-", date('Y-m-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) { // Y-m-d 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 d-m-y 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 d-m-y 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 y-m-d.
To avoid potential ambiguity, it's best to use ISO 8601 (YYYY-MM-DD) dates or
DateTime::createFromFormat() when possible.
можно использовать Carbon
библиотека, который является расширением API для DateTime.
вы можете:
function calculate_age($date) {
$date = new \Carbon\Carbon($date);
return (int) $date->diffInYears();
}
или:
$age = (new \Carbon\Carbon($date))->age;
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;
}
Я нашел этот скрипт надежным. Он принимает формат даты как гггг-ММ-ДД, но его можно легко изменить для других форматов.
/*
* 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' => 'Y-m-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
Если вам не нужна большая точность, просто количество лет, вы могли бы рассмотреть, используя код ниже ...
print floor((time() - strtotime("1971-11-20")) / (60*60*24*365));
вам нужно только поместить это в функцию и заменить дату "1971-11-20" переменной.
обратите внимание, что точность кода выше не высока из-за високосных лет, т. е. примерно каждые 4 года дни 366 вместо 365. Выражение 60*60*24*365 вычисляет количество секунд в одном году - вы можете заменить его с 31536000.
еще одна важная вещь заключается в том, что из-за использования в Unix отметка времени имеет как 1901 год, так и 2038 год, что означает, что выражение выше не будет работать правильно для дат до 1901 года и после 2038 года.
Если вы можете жить с ограничениями, упомянутыми выше, что код должен работать для вас.
Это моя функция для вычисления 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); /* with my local time is 2014-07-01 */ echo sprintf("age = %d years %d months %d days",$age['y'],$age['m'],$age['d']); /* output -> age = 29 year 1 month 24 day */
эта функция возвращает возраст в годах. Входное значение - это дата, сформированная (гггг-ММ-ДД) день рождения строки, например: 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;
}
Ура, Нира
//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('Y-m-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 для вас:
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;
}
верхний ответ для этого в порядке, но только calualtes год человек родился, я настроил его для моих собственных целей, чтобы работать день и месяц. Но подумал, что стоит поделиться.
это работает, взяв временную метку DOB пользователей, но не стесняйтесь изменять это
$birthDate = date('d-m-Y',$usersDOBtimestamp);
$currentDate = date('d-m-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;
Если вы хотите получить только fullyears как возраст, есть сверхпрочный способ сделать это. рассматривайте даты, отформатированные как "YYYYMMDD", как числа и вычитайте их. После этого отмените часть MMDD, разделив результат на 10000 и опустите его. Простой и никогда не терпит неудачу, даже учитывает leapyears и Ваше текущее время сервера;)
С рождения или в основном предоставляются полные даты на месте рождения, и они имеют отношение к текущему местному времени (где проверка возраста на самом деле сделанный.)
$now = date['Ymd'];
$birthday = '19780917'; #september 17th, 1978
$age = floor(($now-$birtday)/10000);
Итак, если вы хотите проверить, является ли кто-то 18 или 21 или ниже 100 в вашем часовом поясе (неважно, в часовом поясе происхождения) по дню рождения, это мой способ сделать это
попробуйте любой из них с помощью объекта DateTime
$hours_in_day = 24;
$minutes_in_hour= 60;
$seconds_in_mins= 60;
$birth_date = new DateTime("1988-07-31T00:00:00");
$current_date = new DateTime();
$diff = $birth_date->diff($current_date);
echo $years = $diff->y . " years " . $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $months = ($diff->y * 12) + $diff->m . " months " . $diff->d . " day(s)"; echo "<br/>";
echo $weeks = floor($diff->days/7) . " weeks " . $diff->d%7 . " day(s)"; echo "<br/>";
echo $days = $diff->days . " days"; echo "<br/>";
echo $hours = $diff->h + ($diff->days * $hours_in_day) . " hours"; echo "<br/>";
echo $mins = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour) . " minutest"; echo "<br/>";
echo $seconds = $diff->h + ($diff->days * $hours_in_day * $minutes_in_hour * $seconds_in_mins) . " seconds"; echo "<br/>";
попробуйте это :
<?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;