Подумал, что я добавлю это здесь, так как это, кажется, самая популярная форма этого вопроса.
Я провел 100-летнее сравнение трех наиболее популярных типов возрастных функций, которые я мог найти для PHP, и опубликовал результаты (а также функции) в своем блоге. .
Как вы можете видеть здесь , все 3 funcs хорошо преформы только с небольшой разницей на 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.
mktime()
. Кажется, php просчиталсяstrtotime()
с этим форматом.