Подскажите пожалуйста. У меня есть форма где человек вбивает дату своего рождения. Например 01/08/1984, мне нужно узнать сколько человеку лет. В данном случае должно вывести 22. Как можно узнать? Есть какие-то встроенные функции или готовый алгоритм?
Один из вариантов: PHP: <? $str = "01/08/1984"; $arr = explode("/", $str); $result = date("Y") - $arr[2]; echo "Тебе ".$result." лет!"; ?>
Такой вариант не подходит, так как такой вариан определяет возраст не верно, потому что не учитываются месяц и число.
Увидел, как в тетка из кадров на бумажке считает выслугу лет. Очень удивился, не мог поверить, 10 раз перепроверял и оказалось все верно, работает. Способ элементарный. Итак сегодня 04 апреля 2007 года - 2007.04.04 надо посчитать сколько времени прошло с 1981.05.20 Надо просто вычесть одну дату из другой! Итак, вначале вычитаем дни. Т.к. 20 > 04, то берем месяц (30 дней) из 04. Получается 2007.03.34. Вычитаем, получается 14. Далее месяцы. Аналогично берем 1 год (12 месяцев) из 2007. Получается 2006.15 (оставалось 03 + 12 месяцев = 15). Вычитаем 05 = 10. Соответсвенно из 2006 года вычитаем 1981 = 25. Итак, с 20 мая 1981 года прошло 25 лет 10 месяцев и 14 дней! Еще пример. Сколько прошло с 18 декабря 1972года Код (Text): 2007.04.04 - 1972.12.18 ------------- 34.03.16 [b]Прошло 34 года, 3 месяца и 16 дней.[/b] Есть маленькое НО по поводу количества дней в месяце. Так вот, за основу берут 30 дней и все прекрасно работает. А теперь эту идею можно закинуть в код.
Ребята есть более легкий способ узнать сколько человеку лет. Самый легкий. Это спросить у самого человека сколько у него лет =))))
спросить, сколько ему дней и пусть он сам парится, считает ; ) Военный, :shock: танунафиг... А високосные? Надо потестить... Если еще и с високосными все ок,... то вообще супер
а если вот этот подправить??? PHP: <? $base_day = 19; $base_mon = 9; $base_yr = 2006; $current_day = 19; $current_mon = 2; $current_yr = 2007; $base_mon_max = date ("t",mktime (0,0,0,$base_mon,$base_day,$base_yr)); $base_day_diff = $base_mon_max - $base_day; $base_mon_diff = 12 - $base_mon - 1; $start_day = 1; $start_mon = 1; $start_yr = $base_yr + 1; $day_diff = ($current_day - $start_day) + 1; // add today $mon_diff = ($current_mon - $start_mon) + 1; // add current month $yr_diff = ($current_yr - $start_yr); $day_diff = $day_diff + $base_day_diff; $mon_diff = $mon_diff + $base_mon_diff; if ($day_diff >= $base_mon_max) { $day_diff = $day_diff - $base_mon_max; $mon_diff = $mon_diff + 1; } if ($mon_diff >= 12) { $mon_diff = $mon_diff - 12; $yr_diff = $yr_diff + 1; } print "The difference between <b>".$base_yr."-".$base_mon."-".$base_day."</b> "; print "and <b>".$current_yr."-".$current_mon."-".$current_day."</b> is:"; print "<br><br>"; $years = "years"; $days = "days"; if ($yr_diff == "1") $years = "year"; if ($day_diff == "1") $days = "day"; print $yr_diff." ".$years.", "; print $mon_diff." month and "; print $day_diff." ".$days; ?>
Я и говорю, сам не поверил вначале. Несколько листов бумаги исписал, пока сам не убедился, что это работает не зависимо от количества дней в месяце и в году (високосный ли год)
извините что вмешиваюсь, но возможно ли решить задачу этой темы следующим способом текущую дату взять time() др пользователя сделать как mktime( 0,0,0, $month, $day, $year) (путь укажет дату а время мы подставим сами) потом из текущей даты вычесть дату ДР и полученное число разобрать date()'ом?
а после 5.1.0 уже можно сувать ему тупо разницу между двумя значениями даты и узнавать сколько в этой разнице лет, месяцев, дней и тд? помню лет 5 назад на ActionScript'e решал подобную задачу перебором всех дат от "прошлого" до "сегодня" или от "сегодня" до "будущего"... :roll:
Вот рабочий пример на PHP с учетом дня и месяца: Код (Text): <?php $userBirthday = '28.04.1986'; // День рождение юзера $birthday = strtotime($userBirthday); // Получаем unix timestamp нашего дня рождения $years = date('Y') - date('Y',$birthday); // Вычисляем возраст БЕЗ учета текущего месяца и дня $now = time(); // no comments $nowBirthday = mktime(0,0,0,date('m',$birthday),date('d',$birthday),date('Y')); // Получаем день рождение пользователя в этом году if ($nowBirthday > $now) { $years --; // Если дня рождения ещё не было то вычитаем один год } echo $years; ?> Вот, как то так ) Добавлено спустя 16 минут 8 секунд: В дополнение кода, как добавить строковое значение возраста (год,года,лет) Код (Text): $lastDigit = substr($years, strlen($years)-1,1); $yearStr = 'лет'; if ($lastDigit == '1' & $years != '11') { $yearStr = 'год'; } elseif ( ($lastDigit == '2'|$lastDigit == '3'|$lastDigit == '4') & ($years != '12' & $years != '13' & $years != '14') ) { $yearStr = 'года'; } printf('%d %s',$years,$yearStr);
Какую древнюю тему подняли И какой "лохматый" код, без пол литра не разберёшься... А так не проще? Код (PHP): $my = '07.09.1976 22:30:00'; $date_a = new DateTime($my); $date_b = new DateTime(); $interval = $date_b->diff($date_a); echo "Мне исполнилось</br>"; echo $interval->format("лет: %Y</br>"); echo $interval->format("месяцев: %m</br>"); echo $interval->format("дней: %d</br>"); echo $interval->format("часов: %h</br>"); echo $interval->format("минут: %i</br>"); echo $interval->format("секунд: %s</br>"); Добавлено спустя 8 минут 32 секунды: .. с учётом часа, минуты, секунды )))
Тему подняли потому, что она актуальна и по сей день. А Ваш пример не рабочий т.к. он не учитывает текущую дату т.е. было уже ДР или Нет. И он так же не умеет склонять, 21 год, 22 года, 26 лет и т.д. Плюс, он использует расширение которое по умолчанию включено в дистрибутив начиная с версии 5.2 Вообщем, я просто поделился своим решением которое написал сам, за 10 минут без использования сторонних "плюшек".
Читаю вопрос: "нужно узнать сколько лет человеку. И как это не учитывает текущую дату? В моём примере учитывает до секунды. И как это понять: было уже ДР или НЕТ? Да было, уже 36 раз, и нет, 37 и 38 и 39 раз не было. Сама постановка вопроса не корректна. В данном случае нужно знать с чем сравнивать. Если нужно знать было ли в этом году, то это просто элементарно, вычесть разницу в годах и сравнить с годом который получился (с учётом месяца, дня, часа, минуты, секунды). Или: "Есть ли тебе уже 18 лет?" Так это ты сам обозначил как "дополнение" Тем более я показал в своём примере, что необязательно использовать склонение Именно что это плюс ))) Ну хватит уже писать древний код для мамонтов.. Да практически на всех хостингах давно уже как минимум 5.2+, а в большинстве 5.3+ DateTime - это не плюшка, а часть ядра и очень упрощает подобные задачи и очень значительно сокращает код А вот это очень хорошо. Задачи бывают схожие, но подходы разные. Всегда у человека должен быть выбор =)
Это так, согласен.Тут наверно сказывается привычка писать под все версии, плюс мне интересен сам процесс решения. А найти что-то готовое всегда можно, для этого есть старый добрый Google ) Спасибо за Ваш пример!
А я вот с этой привычкой стал бороться.. Уходит уйма времени и только для того, чтобы какой-то мизерный процент пользователей на 2-м пентиуме под 95-й виндой смог посмотреть моё творение. И чтобы найти готовое, сначала это готовое кто-то должен написать =)
В случае с пхп это даже не процент пользователей, а вобще бессмылица. Ибо возьми да поставь новый пхп на сервак и юзай плюшки =)
Нет, вот тут вы сильно заблуждаетесь. На крупных проектах и не очень смена версии ПХП может привести в многочисленным проблемам. Особенно если проект работает давно.
"на крупных проектах" должно найти деньжат чтобы идти в ногу со временем, иначе конкуренты их сожрут. Так что это только вопрос жадности.