Я подумав, що я нагадаю це, оскільки це, мабуть, є найпопулярнішою формою цього питання.
Я провів 100-річне порівняння на 3 найпопулярніших типах вікових функцій, які я міг знайти для PHP, і опублікував свої результати (а також функції) у своєму блозі .
Як ви можете бачити тут , все 3 funcs добре преформи тільки з невеликою різницею на 2 - е функції. Моя пропозиція, заснована на моїх результатах, полягає в тому, щоб використовувати 3-ю функцію, якщо ви не хочете зробити щось конкретне в день народження людини, і в цьому випадку 1-а функція забезпечує простий спосіб зробити саме це.
Знайдено невелику проблему з тестом та ще одну проблему з 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()цей формат.