X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Расчет сколько лет, зная дату рождения, ищу функцию
sc2r2bey
sc2r2bey
Topic Starter сообщение 19.2.2010, 23:28; Ответить: sc2r2bey
Сообщение #1


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


--------------------
Заметки о разработке и не только
программирую web и для we
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yury_mw
yury_mw
сообщение 20.2.2010, 15:57; Ответить: yury_mw
Сообщение #2


(sc2r2bey @ 19.2.2010, 22:28) *
сабж...

sc2r2bey,
примерно, так:
[php]<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>[/php]
Примечание: у этого "вычислятора" возраста есть ограничение по датам рождения: 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.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yury_mw
yury_mw
сообщение 20.2.2010, 16:46; Ответить: yury_mw
Сообщение #3


Исправленный вариант (без ограничений на диапазон дат рождения):
[php]<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>[/php]


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
eyexal
eyexal
сообщение 20.2.2010, 16:56; Ответить: eyexal
Сообщение #4


[php]$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;[/php]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yury_mw
yury_mw
сообщение 20.2.2010, 17:45; Ответить: yury_mw
Сообщение #5


eyexal,
проверьте, у вас напутано.
Например, если $birthday = "19.02.2010"; при текущей дате "20.02.2010" - у вас получится возраст "минус 1 год"
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
eyexal
eyexal
сообщение 20.2.2010, 19:05; Ответить: eyexal
Сообщение #6


Да скрипт несет только основу логики, если его применять то надо писать больше проверок !
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
Topic Starter сообщение 14.3.2010, 0:50; Ответить: sc2r2bey
Сообщение #7


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 14.3.2010, 1:04; Ответить: ZiTosS
Сообщение #8


sc2r2bey, пробел уберите, между именем функции и круглыми скобками.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
yury_mw
yury_mw
сообщение 14.3.2010, 1:40; Ответить: yury_mw
Сообщение #9


[quote name='sc2r2bey' post='2618595']выдает ошибку Deprecated: Function split() is deprecated in Z:homedemowwwdemo.php on line 7[/quote]
sc2r2bey, вы, наверное, свежий Денвер с PHP 5.3 поставили?
Короче, замените строку
[php]$birth = split ('[/.-]', $birth_date);[/php] на
[php]$birth = preg_split('/[.-/]/', $birth_date);[/php]и ошибки уйдут.

А проблема связана с тем, что при переходе к 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]


Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) В течении десяти лет копил деньги . Куда вложить?
19 kapusta1 1625 8.4.2024, 10:39
автор: Skyworker
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыСколько времени нужно для раскачки нового сайта?
29 metvekot 7984 8.3.2024, 15:41
автор: malamut
Открытая тема (нет новых ответов) "Лежащий" домен - 10 лет. Продать?
8 Wolfhound 2583 5.3.2024, 3:22
автор: Liudmila
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыНакрутка ПФ сайта в Яндекс. Опыт более 2 лет
Профессиональная Накрутка Позиций
51 EnotPF 47903 27.8.2023, 3:11
автор: unixway
Горячая тема (нет новых ответов) Занимаюсь добычей качественного контента из Вебархива. Опыт уже более трех лет
Предоставляю только качественный, читабельный контент.
62 kuz999 38081 27.7.2023, 13:55
автор: kuz999


 



RSS Текстовая версия Сейчас: 16.4.2024, 14:59
Дизайн