PHP вычисляет текущий возраст человека

У меня на сайте даты рождения в формате 12.01.1980.

$person_date (string) = Day.Month.Year

Хочу добавить старости лица. Например, "Сейчас 30 лет" (2010–1980 = 30 лет).

Но создание функции только по годам не может дать идеального результата:

Если дата рождения человека 12.12.1980, а текущая дата 01.01.2010, человеку не 30 лет. Это 29 лет и один месяц.

Должен быть расчет таргетинга на год, месяц и день рождения со сравнением текущей даты:

0) Разобрать даты.

Birth date (Day.Month.Year):
Day = $birth_day;
Month = $birth_month;
Year = $birth_year;

Current date (Day.Month.Year):
Day = $current_day;
Month = $current_month;
Year = $current_year;

1) сравнение года, 2010 - 1980 = пишем "30" (пусть будет $total_year переменная)

2) сравните месяцы, если (месяц даты рождения больше, чем текущий месяц (например, 12 в рождении и 01 в текущем)) { сделать минус один год из $total_year переменной (30 - 1 = 29) }. Если же минус случился, закончите расчеты на этом месте. Остальное переходите к следующему (3 шаг).

3) else if (birth month < current month) { $total_year = $total_year (30); }

4) else if (birth month = current month) { $total_year = $total_year (30); }

и проверьте день (на этом шаге):

 if(birth day = current day) { $total_year = $total_year; }
 else if (birth day > current day) { $total_year = $total_year -1; }
 else if (birth day < current day) { $total_year = $total_year; }

5) эхо $total_year;

У меня плохое знание php, надеюсь, вы поможете.

Спасибо.


person James    schedule 01.08.2010    source источник
comment
Посчитать дни между датой рождения и настоящим, умножить на 4, разделить на 1461 (вместо деления с плавающей запятой на 365,25)?   -  person pascal    schedule 01.08.2010
comment
@pascal: как бы ты считал дни?   -  person Svish    schedule 30.11.2010


Ответы (3)


Вы можете использовать класс DateTime и его diff().

<?php
$bday = new DateTime('12.12.1980');
// $today = new DateTime('00:00:00'); - use this for the current date
$today = new DateTime('2010-08-01 00:00:00'); // for testing purposes

$diff = $today->diff($bday);

printf('%d years, %d month, %d days', $diff->y, $diff->m, $diff->d);

печатает 29 years, 7 month, 20 days

person VolkerK    schedule 01.08.2010

Расширение ответа @VolkerK - это отлично! Мне никогда не нравится видеть нулевой возраст, который случается, если вы используете только год. Эта функция показывает их возраст в месяцах (если им один месяц или больше), а в остальных случаях — в днях.

function calculate_age($birthday)
{
    $today = new DateTime();
    $diff = $today->diff(new DateTime($birthday));

    if ($diff->y)
    {
        return $diff->y . ' years';
    }
    elseif ($diff->m)
    {
        return $diff->m . ' months';
    }
    else
    {
        return $diff->d . ' days';
    }
}
person Jonathan    schedule 20.01.2012
comment
Хорошая работа здесь @jonathan. Это действительно здравое продолжение работы VolkerK. Я снова модифицировал его, чтобы получить более «человеческий» результат, см. ниже. Спасибо! - person itsricky; 09.02.2013

Я расширил ответ @Jonathan, чтобы дать более «дружественный к человеку» ответ.

Используя эти даты:

$birthday= new DateTime('2011-11-21');
//Your date of birth.

И вызов этой функции:

function calculate_age($birthday)
{
    $today = new DateTime();
    $diff = $today->diff(new DateTime($birthday));

    if ($diff->y)
    {
        return 'Age: ' . $diff->y . ' years, ' . $diff->m . ' months';
    }
    elseif ($diff->m)
    {
        return 'Age: ' . $diff->m . ' months, ' . $diff->d . ' days';
    }
    else
    {
        return 'Age: ' . $diff->d . ' days old!';
    }
}; 

Возвращается:

Age: 1 years, 2 months

Симпатичный - для совсем маленьких, которым всего несколько дней от роду!

person itsricky    schedule 09.02.2013
comment
$день рождения должен быть $bday - person ow3n; 11.03.2015