Перейти к содержимому

Сервис обмена электронных валют

Партнерская программа Kredov

Расчет сколько лет, зная дату рождения

#1 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71
0

Отправлено 19 Февраль 2010 - 22:28

Нужно, зная дату рождения, рассчитать возраст

 

 

  • 0

#2 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 20 Февраль 2010 - 14:57

сабж...

sc2r2bey,
примерно, так:
<html>
<body>
<?php

function age($birth_date)
{
$birth_time = strtotime($birth_date);
$birth = getdate($birth_time);
$now = getdate();
$age = $now['year'] - $birth['year'];
if($now['mon'] < $birth['mon'])
$age--;

if($now['mon'] === $birth['mon'])
if($now['mday'] < $birth['mday'])
$age--;

return $age;

}

//выводит строку "год"/"года"/"лет" в зависимости от числового значения возраста, например: "22 года" или "45 лет"
function s_years($age)
{
$age = abs($age);
$t1 = $age % 10;
$t2 = $age % 100;
$a_str = "";
if ($t1 == 1) $a_str = "год";
else if (($t1 >= 2) && ($t1 <= 4)) $a_str = "года";
if (($t1 >= 5) && ($t1 <= 9) || ($t1 == 0) || ($t2 >= 11) && ($t2 <= 19)) $a_str = "лет";
return $a_str;
}


$s_bdate = "14.12.1901";
echo "Если дата рождения $s_bdate, то возраст " . age($s_bdate) . " " . s_years(age($s_bdate)) . "<br>";
$s_bdate = "14.12.1957";
echo "Если дата рождения $s_bdate, то возраст " . age($s_bdate) . " " . s_years(age($s_bdate)) . "<br>";
$s_bdate = "19.02.2010";
echo "Если дата рождения $s_bdate, то возраст " . age($s_bdate) . " " . s_years(age($s_bdate)) . "<br>";
$s_bdate = "20.02.2010";
echo "Если дата рождения $s_bdate, то возраст " . age($s_bdate) . " " . s_years(age($s_bdate)) . "<br>";
$s_bdate = "11.11.1993";
echo "Если дата рождения $s_bdate, то возраст " . age($s_bdate) . " " . s_years(age($s_bdate)) . "<br>";

?>
</body>
</html>

Примечание: у этого "вычислятора" возраста есть ограничение по датам рождения: 14.12.1901 - 19.01.2038.
Есть подозрение, что при выходе за этот диапазон накрывается счетчик, отсчитывающий секунды от 1970 года.
(http://www.php.su/functions/?date): Для большинства систем допустимыми являются даты с 13 декабря 1901, 20:45:54 GMT по 19 января 2038, 03:14:07 GMT. (Эти даты соответствуют минимальному и максимальному значению 32-битового целого со знаком). Для Windows допустимы даты с 01-01-1970 по 19-01-2038.

  • 0

#3 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 20 Февраль 2010 - 15:46

Исправленный вариант (без ограничений на диапазон дат рождения):
<html>
<body>
<?php

function age($birth_date)
{
$birth = split ('[/.-]', $birth_date);
$now = getdate();
$age = $now['year'] - $birth[2];
if($now['mon'] < $birth[1])
$age--;

if($now['mon'] == $birth[1])
if($now['mday'] < $birth[0])
$age--;

return $age;
}

//выводит строку "год"/"года"/"лет" в зависимости от числового значения возраста, например: "22 года" или "45 лет"
function s_years($age) {
$age = abs($age);
$t1 = $age % 10;
$t2 = $age % 100;
return ($t1 == 1 && $t2 != 11 ? "год" : ($t1 >= 2 && $t1 <= 4 && ($t2 < 10 || $t2 >= 20) ? "года" : "лет"));
}



$s_bdate = "25.08.1530";
$age = age($s_bdate);
echo "Если бы Иван Грозный, родившийся $s_bdate, не умер, то сейчас ему было бы $age " . s_years($age);
$s_bdate = "26-08-1828";
$age = age($s_bdate);
echo "<br>Лев Толстой родился $s_bdate. Это было $age " . s_years($age) . " назад.";
$s_bdate = "13/11/1729";
$age = age($s_bdate);
echo "<br>А. В. Суворов — великий русский полководец, не потерпевший ни одного поражения в своей военной карьере, родился $s_bdate. С тех пор прошло $age " . s_years($age);
?>
</body>
</html>

  • 0

#4 eyexal

eyexal
  • Пользователь
  • 29 сообщений
  • Репутация: 0

Отправлено 20 Февраль 2010 - 15:56

$birthday = "09.07.1988";
$birthday = explode('.',$birthday);
if($birthday[1] >= date(m))
{
if ($birthday[0] >= date(d))
{
$years = date(Y) - $birthday[2];
}
else
{
$years = date(Y) - $birthday[2]-1;
}
}
else
{
$years = date(Y) - $birthday[2]-1;
}
echo $years;

  • 0

#5 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 20 Февраль 2010 - 16:45

eyexal,
проверьте, у вас напутано.
Например, если $birthday = "19.02.2010"; при текущей дате "20.02.2010" - у вас получится возраст "минус 1 год"


  • 0

#6 eyexal

eyexal
  • Пользователь
  • 29 сообщений
  • Репутация: 0

Отправлено 20 Февраль 2010 - 18:05

Да скрипт несет только основу логики, если его применять то надо писать больше проверок !
  • 0

#7 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 13 Март 2010 - 23:50

выдает ошибку Deprecated: Function split() is deprecated in Z:\home\demo\www\demo.php on line 7


  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 14 Март 2010 - 00:04

sc2r2bey, пробел уберите, между именем функции и круглыми скобками.
  • 0

#9 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 14 Март 2010 - 00:40

выдает ошибку Deprecated: Function split() is deprecated in Z:homedemowwwdemo.php on line 7

sc2r2bey, вы, наверное, свежий Денвер с PHP 5.3 поставили?
Короче, замените строку
$birth = split ('[/.-]', $birth_date);
на
$birth = preg_split('/[.-/]/', $birth_date);
и ошибки уйдут.

А проблема связана с тем, что при переходе к PHP 5.3.x многие функции переведены в разряд устаревших (подлежащих удалению в будущем). В новой версии php их еще можно заставить работать настройками в файле php.ini, но с версии PHP 6 разработчики обещают убрать такие функции совсем.
Подробности см, например, тут: http://php.su/php/?migration53

Следующие директивы php.ini будут отмечены как НЕИСПОЛЬЗУЕМЫЕ (DEPRECATED) в PHP 5.3 и удалены в PHP 6.0.0

  • define_syslog_variables - теперь всегда OFF.
  • register_globals - теперь всегда OFF. Наконец-то! =)
  • register_long_arrays - $HTTP_*_VARS навсегда уйдут в небытие.
  • safe_mode - безопасный режим. По умолчанию OFF.
  • magic_quotes_gpc
    magic_quotes_runtime
    magic_quotes_sybase - будут удалены при переходе версии.
  • Теперь в php.ini файле нельзя будет применять коментарии, начинающиеся с #

Так же следующие функции:

  • call_user_method() (используйте call_user_func())
  • call_user_method_array() (используйте call_user_func_array())
  • define_syslog_variables()
  • dl()
  • ereg() (используйте preg_match())
  • ereg_replace() (используйте preg_replace())
  • eregi() (используйте preg_match() с модификатором 'i')
  • eregi_replace() (используйте preg_replace() с модификатором 'i')
  • set_magic_quotes_runtime() и ее синоним(alias) magic_quotes_runtime()
  • session_register() (используйте $_SESSION)
  • session_unregister() (используйте $_SESSION)
  • session_is_registered() (используйте $_SESSION)
  • set_socket_blocking() (используйте stream_set_blocking())
  • split() (используйте preg_split())
  • spliti() (используйте preg_split() с модификатором 'i')
  • sql_regcase()
  • mysql_db_query() (используйте mysql_select_db() и mysql_query())
  • mysql_escape_string() (используйте mysql_real_escape_string())

И следующие возможности:

  • В new передача параметра по ссылке в переменную
  • Вызов call-time функций, методов и классов по ссылке
  • Использование {} для указания смещения внутри строки. Теперь это можно сделать с помощью [] (как в массиве)

Следует позаботиться о замене функций аналогами, описанными выше и переписать скрипты.[/quote]


  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru