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


Автор: Mister U 31.8.2004, 15:11
Хочу на сайте своем сделать отображение возраста зарегистрированных посетителей в днях. Вычислять только решил с учетом всех високосных годов. Никак не получается! Помогите разобраться, или подскажите как можно иначе сделать то, что я пытаюсь сделать, и прийти к нужному результату.
Дату рождения ставлю свою - 4 марта 1988. По состоянию на 31 августа 2004 года я живу 6023 дня (вручную посчитал... хех...). А мне мой скрипт говорит, что я живу 6001 день.. sad.gif

Код
<?php

$b_day=4;
$b_month=3;
$b_year=1988;

$year1=array("31", "59", "90", "120", "151", "181", "212", "243", "273",

"304", "334", "365");
$year2=array("31", "60", "91", "121", "152", "182", "213", "244", "274",

"305", "335", "366");
$y_year1=array("31", "28", "31", "30", "31", "30", "31", "31", "30", "31",

"30", "31");
$y_year2=array("31", "29", "31", "30", "31", "30", "31", "31", "30", "31",

"30", "31");


// вычисляем количество дней жизни в году рождения
if($b_year%4==0)
{
$age=366-($year2[$b_month-1]-$b_day);

}
else
{
$age=365-($year1[$b_month-1]-$b_day);
}


// вычисляем количество дней жизни в текущем году
if(date("Y")%4==0)
{
$age=$age+($year2[date("n")-1]-($y_year2[date("n")-1]-date("d")));
}
else
{
$age=$age+($year1[date("n")-1]-($y_year1[date("n")-1]-date("d")));
}


// вычисляем количество дней жизни всего
for($i=$b_year+1;$i<date("Y");$i++)
{
if($i%4==0)
{
 $age=$age+366;
}
else
{
 $age=$age+365;
}
}


// готово
echo "Возраст: ".$age." дней";

?>

Автор: Akina 31.8.2004, 15:29
=(mktime(одна дата) - mktime(вторая дата)) / 60 / 60 / 24;

Автор: sergejzr 31.8.2004, 15:35
правила для високосного года:

# если делится на 4 (как у тебя в коде).
# если делится на 100 то это НЕ високосный год
# если делится на 400 то в любом случе високосный.

if((y%4==0&&y%100!=0) || y%400==0)


Автор: Mister U 31.8.2004, 15:43
Да, я знаю такой вариант, но не подходит! mktime() работает только с годами выше 1970 г. А если год рождения кого либо 1965 например?

Автор: Mister U 31.8.2004, 16:15
Всё, разобрался! Это была ошибка при вычислении прожитых дней в году рождения.

Вот правильный код.. если надо.. :
Код
// вычисляем количество дней жизни в году рождения
if($b_year%4==0 && $b_year%100<>0 || $b_year%400==0)
{
$age=366-($year2[$b_month-1]-($y_year2[$b_month-1]-$b_day));

}
else
{
$age=365-($year1[$b_month-1]-($y_year2[$b_month-1]-$b_day));
}

Автор: MuToGeN 31.8.2004, 16:27
mktime() вроде и с отрицательными значениями таймстемпов работает. Или я ошибаюсь?

Автор: Mister U 31.8.2004, 16:44
MuToGeN
я пробовал поставить год 1900 - мне вывелось какое-то кол-во дней (не помню), разделил на 365 - получилось 34,0562345234 (после запятой тоже не помню что было..), то бишь от 1970 г.

Автор: Ignat 31.8.2004, 17:05
MuToGeN
Цитата
Windows: Ни одна из версий Windows не поддерживает отрицательные метки времени. Поэтому для Windows допустимыми являются значения year между 1970 и 2038.


http://ru.php.net/manual/ru/function.mktime.php

Автор: Mister U 31.8.2004, 18:44
sergej.z
Стоп! А как же быть с 2000м годом? Он делится и на 100, и на 4, и на 400 biggrin.gif

Автор: sergejzr 31.8.2004, 20:37
Цитата(Mister @ 31.8.2004, 17:44)
Стоп! А как же быть с 2000м годом? Он делится и на 100, и на 4, и на 400

Не я эти правила придумал smile.gif
2000 делится на 400. Этого критерия достаточно, что бы считать его високосным (посмотри в if) smile.gif

Автор: Mister U 31.8.2004, 23:21
sergej.z
Но, заметь, на 100 делятся только годы, заканчивающиеся на 00. Например: 1900, 2000..
Потому что если, к примеру, разделить год 1978 (не високосный) на 100, будет 19,78 (запятую то бишь переносим), а делятся тока те годы, которые заканчиваются на 00...

Автор: sergejzr 1.9.2004, 01:07
Цитата(Mister @ 31.8.2004, 22:21)
sergej.z Но, заметь, на 100 делятся только годы, заканчивающиеся на 00. Например: 1900, 2000.. Потому что если, к примеру, разделить год 1978 (не високосный) на 100, будет 19,78 (запятую то бишь переносим), а делятся тока те годы, которые заканчиваются на 00...

?? qstn.gif
Не понял smile.gif
Цитата
Но, заметь, на 100 делятся только годы, заканчивающиеся на 00
вроде всегда так было smile.gif
qstn.gif

Автор: Secandr 1.9.2004, 07:57
Цитата(Mister @ 31.8.2004, 16:43)
Да, я знаю такой вариант, но не подходит! mktime() работает только с годами выше 1970 г. А если год рождения кого либо 1965 например?

А ты прибавь к годам по 80 лет и нет проблем smile.gif или по 400 smile.gif

Автор: MuToGeN 1.9.2004, 11:07
Цитата(Ignat @ 31.8.2004, 17:05)
Windows: Ни одна из версий Windows не поддерживает отрицательные метки времени. Поэтому для Windows допустимыми являются значения year между 1970 и 2038.

Ясно.
Я все на никсовом сервере отлаживаю.

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