PHP 计算年龄

我正在寻找一种方法来计算一个人的年龄,给出他们的出生日期在格式 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;

编辑: 此函数在某些时候似乎工作正常,但对于出生日期为14/09/1986,返回“40”

return floor((time() - strtotime($birthdayDate))/31556926);
332671 次浏览
//replace / with - so strtotime works
$dob = strtotime(str_replace("/","-",$birthdayDate));
$tdate = time();
return date('Y', $tdate) - date('Y', $dob);
 $date = new DateTime($bithdayDate);
$now = new DateTime();
$interval = $now->diff($date);
return $interval->y;
  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;
}
$tz  = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
->diff(new DateTime('now', $tz))
->y;

从 PHP5.3.0开始,您可以使用方便的 DateTime::createFromFormat来确保您的日期不会被误认为 m/d/Y格式和 DateInterval类(通过 DateTime::diff) ,以获得从现在到目标日期之间的年数。

这样挺好的。

<?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;
?>

如果您不需要很高的精度,只需要年数,您可以考虑使用下面的代码..。

 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年之后的日期不能正确使用。

如果你能忍受上面提到的限制,那么代码应该对你有用。

$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);

我发现这个剧本很可靠。它的日期格式为 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;
}

我想我应该把这个放在这里,因为这似乎是这个问题最流行的形式。

我对我能找到的3种最流行的 PHP 年龄函数进行了100年的比较,并将我的结果(以及函数)发布到了 我的博客

正如您可以看到的 那里,所有3个函数的预成型都很好,只是第2个函数略有不同。根据我的结果,我的建议是使用第三个函数,除非你想在某人的生日做一些特定的事情,在这种情况下,第一个函数提供了一个简单的方法来做到这一点。

发现小问题与测试,另一个问题与第二种方法!博客即将更新!现在,我要注意的是,第二种方法仍然是我在网上找到的最流行的方法,但仍然是我发现最不准确的方法!

百年回顾之后我的建议:

如果你想要一些更长的东西,这样你就可以包括生日之类的场合:

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.

如果你想计算使用 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;


}

如果你似乎不能使用一些新的功能,这里有一些我迅速制作的东西。可能比你需要的多,我相信有更好的方法,但它很容易阅读,所以它应该做的工作:

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--;
}

从出生日期计算年龄的简单方法:

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

31556926是一年中的秒数。

下面的例子对我来说非常有用,而且看起来比已经给出的例子要简单得多。

$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;
}

我已经测试并积极使用这段代码,它可能看起来有点麻烦,但是它使用和编辑起来非常简单,而且非常准确。

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

在第一个逻辑之后,必须在比较中使用 = 。

<?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.


?>

这个函数工作得很好,是对 Parkyprg代码的一个小小的改进

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;
}

在 DD/MM/YYYY 中使用 strtotime 时会出现问题。你不能使用这种格式。您可以使用 MM/DD/YYYY (或者许多其他类似于 YYYMMDD 或 YYYY-MM-DD 的方法)来代替它,它应该能够正常工作。

我使用日期/时间:

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

如何启动这个查询并让 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个月(它算一整个月)

回顾所提供的解决方案,我总是想到现代教育在 IT 领域的弊端。大多数开发人员都忘记了,即使是现代 CPU 也会受到执行条件运算符的影响,而算术运算,尤其是2的运算速度更快。 因此,为了达到这个目的,我在 PHP 线程中展示了这个解决方案,没有进行任何优化:

  list($year,$month,$day) = explode("-",$birthday);
$age=floor(((date("Y")-$year)*512+(date("m")-$month)*32+date("d")-$day)/512);

在有严格的类型定义和能够替换 * 和/用移位的其他语言中, 这个公式将“飞”。也可以改变除数你可以计算年龄在月,星期等。 请注意,差异中操作数的顺序是必不可少的

这是我计算出生日期的函数,按年、月和日计算年龄的具体返回值

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 */

我是这样做的。

$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;
}

试试这个:

<?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;

这个问题的最佳答案是可以的,但只能算出一个人出生的年份,我根据自己的目的调整了一下,计算出了日期和月份。但觉得值得分享。

这是通过获取用户 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;

我觉得这很简单。

从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

如果你只想随着年龄的增长而成年,有一个超级简单的方法可以做到这一点。将格式为“ YYYYMMDD”的日期视为数字并减去它们。之后,通过将结果除以10000来抵消 MMDD 部分,并将其降至最低。简单,从不失败,甚至考虑到跨越年代和你当前的服务器时间;)

因为生日或大部分提供完整的日期在出生地点,他们是相关的当前当地时间(那里的年龄检查实际上完成)。

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

因此,如果你想在生日前查看某人是18岁还是21岁,或者在你的时区(不用管起源时区)100岁以下,这就是我的方法

这个函数将返回年龄。输入值是形成日期(YYYY-MM-DD)的出生日期字符串,例如: 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;
}

干杯 Nira

下面是计算年龄的简单函数:

<?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');
?>

使用 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/>";

参考资料 http://www.calculator.net/age-calculator.html

准备好使用返回完整结果的函数(年、月、日、小时、分、秒)。 对于当前日期以上的日期 ,它将 返回对倒计时函数有用的负值

/* By default,
* format is 'us'
* and delimiter is '-'
*/


function date_calculate($input_date, $format = 'us', $delimiter = '-')
{
switch (strtolower($format)) {
case 'us': // date in 'us' format (yyyy/mm/dd), like '1994/03/01'
list($y, $m, $d) = explode($delimiter, $input_date);
break;
case 'fr': // date in 'fr' format (dd/mm/yyyy), like '01/03/1994'
list($d, $m, $y) = explode($delimiter, $input_date);
break;
default: return null;
}


$tz          = new \DateTimeZone('UTC'); // TimeZone. Not required but can be useful. By default, server TimeZone will be returned
$format_date = sprintf('%s-%s-%s', $y, $m, $d);
$cur_date    = new \DateTime(null, $tz);
$user_date   = new \DateTime($format_date, $tz);
$interval    = $user_date->diff($cur_date);


return [
'year'  => $interval->format('%r%y'),
'month' => $interval->format('%r%m'),
'day'   => $interval->format('%r%d'),
'hour'  => $interval->format('%r%H'),
'min'   => $interval->format('%r%i'),
'sec'   => $interval->format('%r%s'),
];
}


var_dump(date_calculate('06/09/2016', 'fr', '/'));
var_dump(date_calculate('2016-09-06'));

更多 + + :

//年龄计算器

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);

您可以使用 Carbon,它是 DateTime 的 API 扩展。

你可以:

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

或:

$age = (new \Carbon\Carbon($date))->age;

编写一个 PHP 脚本来计算一个人的当前年龄。

出生日期: 1987年4月11日

解决方案示例:

PHP 代码:

<?php
$bday = new DateTime('11.4.1987'); // Your date of birth
$today = new Datetime(date('m.d.y'));
$diff = $today->diff($bday);
printf(' Your age : %d years, %d month, %d days', $diff->y, $diff->m, $diff->d);
printf("\n");
?>

输出样本:

你的年龄: 30岁3个月零天

下面的过程更简单,可以同时适用于格式 dd/mm/yyyy 和 dd-mm-yyyy。这对我很有效:

    <?php
        

$birthday = '26/04/1994';
                                                            

$dob = strtotime(str_replace("/", "-", $birthday));
$tdate = time();
echo date('Y', $tdate) - date('Y', $dob);


?>