PHP计算年龄

ste*_*tef 155 php

我正在寻找一种方法来计算一个人的年龄,因为他们的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)

  • PHP的`strtotime`完全理解日期格式,你不必担心:`m/d/y或dmy格式的日期通过查看各个组件之间的分隔符来消除歧义:如果分隔符是斜杠(/) ,然后假设美国m/d/y; 而如果分隔符是破折号( - )或点(.),则假定为欧洲dmy格式.http://php.net/manual/en/function.strtotime.php (29认同)

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)可以获得从现在到目标日期之间的年数.

  • 真的需要时区吗? (2认同)

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 是一年中的秒数.

  • 过度使用函数......`$ _age = floor((time() - strtotime('1986-09-16'))/ 31556926);` (16认同)
  • 最佳解决方案...... 1个内胆,简单,避免使用:mktime (4认同)
  • 闰秒怎么样? (3认同)
  • 这是行不通的。```echo Floor((strtotime('2010-03-05') - strtotime('2000-03-05')) / 31556926);``` 返回 9,但应该返回 10。 (2认同)

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)

  • 2016年最佳现代解决方案 (5认同)

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)


Bro*_*shi 8

您可以使用该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)


SpY*_*3HH 7

想我会把它扔在这里,因为这似乎是这个问题最流行的形式.

我对我能找到的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)

见BLOG


关于该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)


Hos*_*agh 7

编写一个 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 年之后的日期无法正确工作。

如果您可以忍受上述限制,那么该代码应该适合您。


Dmi*_*riy 5

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