Как рассчитать возраст от даты с Zend_Date - PullRequest
1 голос
/ 07 августа 2011

Как рассчитать возраст от даты рождения, используя объект Zend_Date?

Ответы [ 7 ]

7 голосов
/ 08 августа 2011

Вот еще один способ расчета возраста.Он использует формат PHP.Он просто вычитает годы, а затем проверяет, прошел ли этот день рождения или нет.Это можно легко сделать с помощью стандартных функций PHP, но я решил использовать Zend_Date, как вы и просили.

Обновленный ответ

    Zend_Date::setOptions(array(
        'format_type' => 'php'
    ));
    $today           = new Zend_Date();
    $dateOfBirth     = new Zend_Date('1979-04-10', 'Y-m-d');

    $age             = $today->toString('Y') - $dateOfBirth->toString('Y');
    // Edit: Added julian date adjustments for leap years
    $adjustJulian    = strcmp($today->toString('L'), $dateOfBirth->toString('L'));
    if ($dateOfBirth->toString('m') > 2) {
        $dateOfBirth->addDay($adjustJulian);
    }

    if ($today->toString('z') < $dateOfBirth->toString('z')) {
        $age--;
    }

Благодаря @maciej-homziuk за указание ограничений високосного года в предыдущем ответе.Я обновил этот ответ, добавив поправки на юлианский день для високосных лет.

1 голос
/ 13 октября 2012

Я советую вам использовать эту функцию:

public function getAge($dob)
{
    $today = new Zend_Date();
    $dob   = new Zend_Date($dob, Tuffle_Date::getDBFormat());

    $y = Zend_Date::YEAR;
    $m = Zend_Date::MONTH;
    $d = Zend_Date::DAY;

    $dobCurrentYear = new Zend_Date($today->get($y) . '-' . $dob->get($m) . '-' . $dob->get($d), Tuffle_Date::getDBFormat());
    $dobCurrentYear->setYear($today->get('Y'));

    $age = $today->get($y) - $dob->get($y);

    if (!$dobCurrentYear->isLater($today)) {
        $age--;
    }

    return $age;
}
0 голосов
/ 08 апреля 2012

Мне очень нравится подход brady.vitrano, и он также послужил основой для построения моего собственного помощника по вычислению возраста в годах, однако его код не учитывает високосные годы (например, дата рождения 1979-03-09 [общий год] и сегодня 2012-03-08 [високосный год], его метод возвращает 33, хотя реальный возраст - 32) - вот как его нужно продлить, чтобы получить правильный возраст, когда речь идет о високосных годах:*

И это код, если вы хотите работать со спецификатором даты Zend по умолчанию (вместо спецификатора даты в PHP):

$today = new Zend_Date();
$dateOfBirth = new Zend_Date($date);

/*** Considering the leap years if the birth date is on 1st march or later. ***/
if ($dateOfBirth->get('M') > 2) {
    /*** Checking if the birth's year is a leap year. ***/
    if ($dateOfBirth->get(Zend_Date::LEAPYEAR)) {
        $birthLeap = 1;
    }

    /*** Checking if today's year is a leap year. ***/
    if ($today->get(Zend_Date::LEAPYEAR)) {
        $todayLeap = 1;
    }
}

$age = $today->get('Y') - $dateOfBirth->get('Y');

if ($today->get('D') - $todayLeap < $dateOfBirth->get('D') - $birthLeap) {
    $age--;
}
0 голосов
/ 15 ноября 2011
$today = new Zend_Date();
$dateOfBirth = new Zend_Date('1988-25-06');
$age = $today->toString('Y') - $dateOfBirth->toString('Y');
if ($today->toString('dd') + $today->toString('MM') * 32 <
    $dateOfBirth->toString('dd') + $dateOfBirth->toString('MM') * 32)
    $age--;
0 голосов
/ 09 августа 2011

Обратите внимание на способ, которым Zend_Date это делает, но, кажется, работает нормально:

$birthdate = "1975-04-14";<br />
$age = floor((time() - strtotime($birthdate)) / 31556926);

echo "You are " . $age . " years old today.";
0 голосов
/ 07 августа 2011

ОТ этого поста: как рассчитать разницу между двумя объектами Zend_Date, в месяцах

Если я правильно прочитал документы, не существует реализованной функциональности для получения разницы между двумя датами в секундах/minutes/.../months/years, поэтому вам нужно будет рассчитать это самостоятельно.Что-то вроде этого подойдет (не знаю, если потребуется високосные годы, летнее время и тому подобное):

<?php
$birth = new Zend_Date('1988-25-06');    
$today = new Zend_Date();
$diff = $today->sub($birth)->toValue();
$age = floor($diff / 3600 / 24 / 365);
0 голосов
/ 07 августа 2011

Вот класс, предназначенный для расчета возраста от даты Zend (см. 1-й ответ): http://forums.zend.com/viewtopic.php?f=69&t=6932

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...