我正在寻找一种方法来计算一个人的年龄,因为他们的DOB格式为dd/mm/yyyy.
我正在使用以下功能,该功能可以正常工作几个月,直到某种故障导致while循环永远不会结束并使整个站点停止运行.由于每天有几十个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;
Run Code Online (Sandbox Code Playgroud)
编辑:这个函数似乎在某些时候工作正常,但对于14/09/1986的DOB返回"40"
return floor((time() - strtotime($birthdayDate))/31556926);
Run Code Online (Sandbox Code Playgroud)
Sud*_*oti 188
这很好用.
<?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;
?>
Run Code Online (Sandbox Code Playgroud)
sal*_*the 166
$tz = new DateTimeZone('Europe/Brussels');
$age = DateTime::createFromFormat('d/m/Y', '12/02/1973', $tz)
->diff(new DateTime('now', $tz))
->y;
Run Code Online (Sandbox Code Playgroud)
从PHP 5.3.0开始,您可以使用方便的方法DateTime::createFromFormat来确保您的日期不会被m/d/Y格式化,并且DateInterval类(via DateTime::diff)可以获得从现在到目标日期之间的年数.
Wer*_*ght 118
$date = new DateTime($bithdayDate);
$now = new DateTime();
$interval = $now->diff($date);
return $interval->y;
Run Code Online (Sandbox Code Playgroud)
And*_*hak 92
我使用日期/时间:
$age = date_diff(date_create($bdate), date_create('now'))->y;
Run Code Online (Sandbox Code Playgroud)
小智 60
从dob计算Age的简单方法:
$_age = floor((time() - strtotime('1986-09-16')) / 31556926);
Run Code Online (Sandbox Code Playgroud)
31556926 是一年中的秒数.
mat*_*ict 15
//年龄计算器
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);
Run Code Online (Sandbox Code Playgroud)
Tra*_*ong 13
我觉得这很有用而且很简单.
从1970年减去因为strtotime从1970-01-01计算时间(http://php.net/manual/en/function.strtotime.php)
function getAge($date) {
return intval(date('Y', time() - strtotime($date))) - 1970;
}
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
小智 8
如果你想计算使用dob的Age,你也可以使用这个函数.它使用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;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用该Carbon库,它是DateTime的API扩展.
您可以:
function calculate_age($date) {
$date = new \Carbon\Carbon($date);
return (int) $date->diffInYears();
}
Run Code Online (Sandbox Code Playgroud)
要么:
$age = (new \Carbon\Carbon($date))->age;
Run Code Online (Sandbox Code Playgroud)
想我会把它扔在这里,因为这似乎是这个问题最流行的形式.
我对我能找到的3种最流行的年龄函数进行了100年的比较,并将我的结果(以及函数)发布到我的博客上.
正如你在那里看到的那样,所有3个功能都很好地完成了第二个功能的细微差别.根据我的结果,我的建议是使用第三个函数,除非你想在一个人的生日那天做一些特定的事情,在这种情况下,第一个函数提供了一种简单的方法来完成它.
找到测试的小问题,第二个方法的另一个问题!即将更新博客!现在,我注意到,第二种方法仍然是我在网上找到的最受欢迎的方法,但仍然是我发现最不准确的方法!
我的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');
Run Code Online (Sandbox Code Playgroud)
但如果你只是想知道年龄而已,仅此而已:
function getAge($date) { // Y-m-d format
return intval(substr(date('Ymd') - date('Ymd', strtotime($date)), 0, -4));
}
getAge('1980-02-29');
Run Code Online (Sandbox Code Playgroud)
关于该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.
Run Code Online (Sandbox Code Playgroud)
编写一个 PHP 脚本来计算一个人的当前年龄。
样本出生日期:11.4.1987
示例解决方案:
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");
?>
Run Code Online (Sandbox Code Playgroud)
示例输出:
您的年龄 : 30 岁 3 个月零 0 天
小智 6
如果您不需要很高的精度,只需要年数,您可以考虑使用下面的代码......
print floor((time() - strtotime("1971-11-20")) / (60*60*24*365));
Run Code Online (Sandbox Code Playgroud)
您只需将其放入函数中并将日期“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);
Run Code Online (Sandbox Code Playgroud)