Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычеслить по дате рождения количество дней жизни, уже полчаса мучаюсь - никак не выходит!! 
:(
    Опции темы
Mister U
Дата 31.8.2004, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.12.2003
Где: Донецк

Репутация: нет
Всего: нет



Хочу на сайте своем сделать отображение возраста зарегистрированных посетителей в днях. Вычислять только решил с учетом всех високосных годов. Никак не получается! Помогите разобраться, или подскажите как можно иначе сделать то, что я пытаюсь сделать, и прийти к нужному результату.
Дату рождения ставлю свою - 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." дней";

?>

PM MAIL ICQ   Вверх
Akina
Дата 31.8.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



=(mktime(одна дата) - mktime(вторая дата)) / 60 / 60 / 24;


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sergejzr
Дата 31.8.2004, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 5
Всего: 360



правила для високосного года:

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

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




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mister U
Дата 31.8.2004, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.12.2003
Где: Донецк

Репутация: нет
Всего: нет



Да, я знаю такой вариант, но не подходит! mktime() работает только с годами выше 1970 г. А если год рождения кого либо 1965 например?
PM MAIL ICQ   Вверх
Mister U
Дата 31.8.2004, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.12.2003
Где: Донецк

Репутация: нет
Всего: нет



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

Вот правильный код.. если надо.. :
Код
// вычисляем количество дней жизни в году рождения
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));
}


Это сообщение отредактировал(а) Admin - 31.8.2004, 20:26
PM MAIL ICQ   Вверх
MuToGeN
Дата 31.8.2004, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 7
Всего: 32



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


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
Mister U
Дата 31.8.2004, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.12.2003
Где: Донецк

Репутация: нет
Всего: нет



MuToGeN
я пробовал поставить год 1900 - мне вывелось какое-то кол-во дней (не помню), разделил на 365 - получилось 34,0562345234 (после запятой тоже не помню что было..), то бишь от 1970 г.
PM MAIL ICQ   Вверх
Ignat
Дата 31.8.2004, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



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


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



--------------------
Теперь при чем :P
PM   Вверх
Mister U
Дата 31.8.2004, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.12.2003
Где: Донецк

Репутация: нет
Всего: нет



sergej.z
Стоп! А как же быть с 2000м годом? Он делится и на 100, и на 4, и на 400 biggrin.gif
PM MAIL ICQ   Вверх
sergejzr
Дата 31.8.2004, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 5
Всего: 360



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

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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Mister U
Дата 31.8.2004, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.12.2003
Где: Донецк

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Mister U - 31.8.2004, 23:24
PM MAIL ICQ   Вверх
sergejzr
Дата 1.9.2004, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 5
Всего: 360



Цитата(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



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Secandr
Дата 1.9.2004, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



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

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


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
MuToGeN
Дата 1.9.2004, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: 7
Всего: 32



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

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


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.