Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Расчёт возраста


Автор: vintyara 22.10.2005, 23:13
Есть таблица в БД, есть в таблице столбецъ с датой рождения, вида, скаэем ДД.ММ.ГГГГ.
Есть функция в php, которая может подсказать нам, какая сегодня дата. Как посчитать кол-во лет юзеру, беря его данные с БД ? А именно -
допустим мы взяли данные пользователя с БД, родился он 26.01.1984.
php функция сказала нам, что сегодня 22.10.2005
Как нам заставить php посчитать сколько же лет человеку, чьи данные мы вытащили ?

Автор: Mal Hack 22.10.2005, 23:42
Разделяешь по точкам. $a1 - текущая
Считаешь (писал на вскидку):
Код

$year = $a1[2] - $a2[2];
if( ( $a1[1] - $a2[1] ) >= 12 OR ( ( $a1[1] - $a2[1] ) = 11 AND ( $a1[0] - $a2[0] ) >= date( "t" ) )  )
 $year += 1;

Автор: Dandik 23.10.2005, 00:27
Код

function Age ($date){
        if(!$date) return false; 
        $date = explode("-",substr($date,0,9));
        $result = date("Y") - $date[0];
            if((date("m") - $date[1]) < 0 )
                return $result - 1;
            else{
                if((date("d") - $date[2]) >= 0 || ((date("m") - $date[1] - 1) >=0 ))
                    return $result;
                else
                    return $result - 1;
            }
    }

Принимает дату в виде стандартного формата MySQL (по умолчанию), возвращает возраст.

Автор: Mal Hack 23.10.2005, 13:17
Подправил малость:
Код

<?php

$data1 = date( "d.m.Y" );
$data2 = "12.12.1981";

$a1 = explode( "." , $data1 );
$a2 = explode( "." , $data2 );

$year = $a1[2] - $a2[2];
if( ( $a1[1] - $a2[1] ) < 11 OR ( ( $a1[1] - $a2[1] ) == 11 AND ( $a1[0] - $a2[0] ) < date( "t" ) ) )
  {  $year -= 1;  }

print $year;

?>

Автор: vintyara 24.10.2005, 22:07
Mal Hack по твоему примеру результат 20 получился smile (при $data1 = date( "d.m.Y" ), $data2= 26.01.1984 smile

Автор: vintyara 24.10.2005, 22:17
я вот придумал полноценный алгоритм. только мне нужно разковырять
Код

date( "d.m.Y" );

на три переменные -
Код

$day
$month
$year

как это сделать ?

Автор: Dandik 24.10.2005, 22:56
Почему не можешь сделать так :
Код

$day = date("d");
$month = date("m");
$year = date("Y");

Или, использя твоё дано :
Код

$arr = explode(".",date("d.m.Y"));
// Элементы массива $arr - искомые переменные

Кстати, чем моя функция тебе не понравилась? неужели не работает?

Автор: vintyara 24.10.2005, 23:14
вот как я придумал smile вроде работает smile

Код

$date_now=date( "d.m.Y" );
$date_bd=$row['date_of_bithd'];
list($day_now, $month_now, $year_now) = split('[/.-]', $date_now);
list($day_bd, $month_bd, $year_bd) = split('[/.-]', $date_bd);
                        
$day=$day_now - $day_bd;
if ($day <= 0 ) { $day='+'; }
$month=$month_now - $month_bd;
if ($month <= 0 ) { $month='+'; }
$year=$year_now - $year_bd;
if ($day == '+' && $month== '+' ) { $year++; }
echo ''. $year.'';

smile
Добавлено @ 23:17
Dandik чесно говоря неразобрался я с твоей функцией smile что-то у меня незаработала, хотя у меня есть подозрения что я неправильно её юзал. У меня с функциями вообще пока тяжко smile но всё равно спасибо smile

Автор: Aliance 24.10.2005, 23:24
split не используют для таких целей, где-то я читал.
Используй explode

Автор: Dandik 24.10.2005, 23:32
Цитата
у меня есть подозрения что я неправильно её юзал

Код

function Age ($date){
        if(!$date) return false; 
        $date = explode("-",substr($date,0,9));
        $result = date("Y") - $date[0];
            if((date("m") - $date[1]) < 0 )
                return $result - 1;
            else{
                if((date("d") - $date[2]) >= 0 || ((date("m") - $date[1] - 1) >=0 ))
                    return $result;
                else
                    return $result - 1;
            }
    }
echo Age("1984-01-26");

Автор: Mal Hack 25.10.2005, 00:19
vintyara
условие поставь такое:
Цитата
if( $a1[1] < $a2[1] OR ( ( $a1[1] == $a2[1] ) AND ( $a1[0] < $a2[0] ) ) )
  {  $year -= 1;  }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)