За последние 24 часа нас посетили 22630 программистов и 1281 робот. Сейчас ищут 832 программиста ...

Нужно узнать сколько лет человеку.

Тема в разделе "PHP для новичков", создана пользователем pr0n1x, 3 апр 2007.

  1. pr0n1x

    pr0n1x Активный пользователь

    С нами с:
    30 мар 2006
    Сообщения:
    486
    Симпатии:
    2
    Адрес:
    Киев
    Подскажите пожалуйста.
    У меня есть форма где человек вбивает дату своего рождения.
    Например 01/08/1984, мне нужно узнать сколько человеку лет.
    В данном случае должно вывести 22.
    Как можно узнать? Есть какие-то встроенные функции или готовый алгоритм?
     
  2. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Один из вариантов:
    PHP:
    1.  
    2. <?
    3. $str = "01/08/1984";
    4. $arr = explode("/", $str);
    5. $result = date("Y") - $arr[2];
    6. echo "Тебе ".$result." лет!";
    7. ?>
    8.  
     
  3. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Demon
    А если $str="01/08/1984", а сегодня "25/07/2007", то сколько человеку лет?
     
  4. Demon

    Demon Активный пользователь

    С нами с:
    20 апр 2006
    Сообщения:
    239
    Симпатии:
    0
    Не тогда так:
    Код (Text):
    1. $result = date("Y")-1 - $arr[2];
    :lol:
     
  5. pr0n1x

    pr0n1x Активный пользователь

    С нами с:
    30 мар 2006
    Сообщения:
    486
    Симпатии:
    2
    Адрес:
    Киев
    если сегодня 25/07/2007 то человеку 22 года.
    если сегодня 02/08/2007 то человеку 23 года.
     
  6. pr0n1x

    pr0n1x Активный пользователь

    С нами с:
    30 мар 2006
    Сообщения:
    486
    Симпатии:
    2
    Адрес:
    Киев
    Такой вариант не подходит, так как такой вариан определяет возраст не верно, потому что не учитываются месяц и число.
     
  7. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    pr0n1x

    гы, а что мешает дополнительно месяц и день проверить?
     
  8. Военный

    Военный Активный пользователь

    С нами с:
    15 янв 2007
    Сообщения:
    70
    Симпатии:
    0
    Увидел, как в тетка из кадров на бумажке считает выслугу лет.
    Очень удивился, не мог поверить, 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):
    1. 2007.04.04
    2. -
    3. 1972.12.18
    4. -------------
    5. 34.03.16
    6. [b]Прошло 34 года, 3 месяца и 16 дней.[/b]
    Есть маленькое НО по поводу количества дней в месяце. Так вот, за основу берут 30 дней и все прекрасно работает.

    А теперь эту идею можно закинуть в код.
     
  9. Adil

    Adil Активный пользователь

    С нами с:
    21 сен 2006
    Сообщения:
    280
    Симпатии:
    0
    Ребята есть более легкий способ узнать сколько человеку лет. Самый легкий. Это спросить у самого человека сколько у него лет =))))
     
  10. pel

    pel Активный пользователь

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    спросить, сколько ему дней и пусть он сам парится, считает ; )


    Военный, :shock:
    танунафиг...

    А високосные? Надо потестить... Если еще и с високосными все ок,... то вообще супер :)
     
  11. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    а если вот этот подправить???
    PHP:
    1.  
    2. <?
    3. $base_day    = 19;
    4. $base_mon    = 9;
    5. $base_yr    = 2006;
    6.  
    7. $current_day = 19;
    8. $current_mon = 2;
    9. $current_yr  = 2007;
    10.  
    11. $base_mon_max = date ("t",mktime (0,0,0,$base_mon,$base_day,$base_yr));
    12.  
    13. $base_day_diff = $base_mon_max - $base_day;
    14.  
    15. $base_mon_diff = 12 - $base_mon - 1;
    16.  
    17. $start_day = 1;
    18. $start_mon = 1;
    19. $start_yr  = $base_yr + 1;
    20.  
    21. $day_diff = ($current_day - $start_day) + 1; // add today
    22. $mon_diff = ($current_mon - $start_mon) + 1; // add current month
    23. $yr_diff  = ($current_yr - $start_yr);
    24.  
    25. $day_diff = $day_diff + $base_day_diff;
    26. $mon_diff = $mon_diff + $base_mon_diff;
    27.  
    28. if ($day_diff >= $base_mon_max) {
    29.     $day_diff = $day_diff - $base_mon_max;
    30.     $mon_diff = $mon_diff + 1;
    31. }
    32.  
    33. if ($mon_diff >= 12) {
    34.     $mon_diff = $mon_diff - 12;
    35.     $yr_diff = $yr_diff + 1;
    36. }
    37.  
    38. print "The difference between <b>".$base_yr."-".$base_mon."-".$base_day."</b> ";
    39. print "and <b>".$current_yr."-".$current_mon."-".$current_day."</b> is:";
    40. print "<br><br>";
    41.  
    42. $years = "years";
    43. $days  = "days";
    44. if ($yr_diff == "1") $years = "year";
    45. if ($day_diff == "1") $days = "day";
    46.  
    47. print $yr_diff." ".$years.", ";
    48. print $mon_diff." month and ";
    49. print $day_diff." ".$days;
    50. ?>
    51.  
     
  12. Военный

    Военный Активный пользователь

    С нами с:
    15 янв 2007
    Сообщения:
    70
    Симпатии:
    0
    Я и говорю, сам не поверил вначале.
    Несколько листов бумаги исписал, пока сам не убедился, что это работает не зависимо от количества дней в месяце и в году (високосный ли год)
    :)
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    извините что вмешиваюсь, но возможно ли решить задачу этой темы следующим способом
    текущую дату взять time()
    др пользователя сделать как mktime( 0,0,0, $month, $day, $year) (путь укажет дату а время мы подставим сами)
    потом из текущей даты вычесть дату ДР и полученное число разобрать date()'ом?
     
  14. pel

    pel Активный пользователь

    С нами с:
    19 янв 2007
    Сообщения:
    569
    Симпатии:
    0
    Адрес:
    Симферополь
    До PHP 5.1.0 для time() и mktime() минимальное значение года == 1970
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    а после 5.1.0 уже можно сувать ему тупо разницу между двумя значениями даты и узнавать сколько в этой разнице лет, месяцев, дней и тд?


    помню лет 5 назад на ActionScript'e решал подобную задачу перебором всех дат от "прошлого" до "сегодня" или от "сегодня" до "будущего"... :roll:
     
  16. Andrey_Go

    Andrey_Go Активный пользователь

    С нами с:
    11 окт 2012
    Сообщения:
    6
    Симпатии:
    0
    Вот рабочий пример на PHP с учетом дня и месяца:
    Код (Text):
    1.  
    2. <?php
    3. $userBirthday = '28.04.1986'; // День рождение юзера
    4. $birthday = strtotime($userBirthday); // Получаем unix timestamp нашего дня рождения
    5. $years = date('Y') - date('Y',$birthday); // Вычисляем возраст БЕЗ учета текущего месяца и дня
    6. $now = time(); // no comments
    7. $nowBirthday = mktime(0,0,0,date('m',$birthday),date('d',$birthday),date('Y')); // Получаем день рождение пользователя в этом году
    8. if ($nowBirthday > $now) {
    9.     $years --; // Если дня рождения ещё не было то вычитаем один год
    10. }
    11. echo $years;
    12. ?>
    Вот, как то так )

    Добавлено спустя 16 минут 8 секунд:
    В дополнение кода, как добавить строковое значение возраста (год,года,лет)
    Код (Text):
    1.  
    2. $lastDigit = substr($years, strlen($years)-1,1);
    3. $yearStr = 'лет';
    4. if ($lastDigit == '1' & $years != '11') {
    5.     $yearStr = 'год';
    6. } elseif (
    7.     ($lastDigit == '2'|$lastDigit == '3'|$lastDigit == '4') &
    8.     ($years != '12' & $years != '13' & $years != '14')
    9.     )
    10. {
    11.     $yearStr = 'года';
    12. }
    13.  
    14. printf('%d %s',$years,$yearStr);
     
  17. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Какую древнюю тему подняли :) И какой "лохматый" код, без пол литра не разберёшься...

    А так не проще?
    Код (PHP):
    1. $my = '07.09.1976 22:30:00';
    2.  
    3. $date_a = new DateTime($my);
    4. $date_b = new DateTime();
    5. $interval = $date_b->diff($date_a);
    6.  
    7. echo "Мне исполнилось</br>";
    8. echo $interval->format("лет: %Y</br>");
    9. echo $interval->format("месяцев: %m</br>");
    10. echo $interval->format("дней: %d</br>");
    11. echo $interval->format("часов: %h</br>");
    12. echo $interval->format("минут: %i</br>");
    13. echo $interval->format("секунд: %s</br>"); 
    Добавлено спустя 8 минут 32 секунды:
    .. с учётом часа, минуты, секунды )))
     
  18. Andrey_Go

    Andrey_Go Активный пользователь

    С нами с:
    11 окт 2012
    Сообщения:
    6
    Симпатии:
    0
    Тему подняли потому, что она актуальна и по сей день.
    А Ваш пример не рабочий т.к. он не учитывает текущую дату т.е. было уже ДР или Нет.
    И он так же не умеет склонять, 21 год, 22 года, 26 лет и т.д.
    Плюс, он использует расширение которое по умолчанию включено в дистрибутив начиная с версии 5.2

    Вообщем, я просто поделился своим решением которое написал сам, за 10 минут без использования сторонних "плюшек".
     
  19. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    Читаю вопрос: "нужно узнать сколько лет человеку. И как это не учитывает текущую дату? В моём примере учитывает до секунды.

    И как это понять: было уже ДР или НЕТ? :) Да было, уже 36 раз, и нет, 37 и 38 и 39 раз не было. Сама постановка вопроса не корректна. В данном случае нужно знать с чем сравнивать. Если нужно знать было ли в этом году, то это просто элементарно, вычесть разницу в годах и сравнить с годом который получился (с учётом месяца, дня, часа, минуты, секунды). Или: "Есть ли тебе уже 18 лет?"


    Так это ты сам обозначил как "дополнение" ;) Тем более я показал в своём примере, что необязательно использовать склонение

    Именно что это плюс ))) Ну хватит уже писать древний код для мамонтов.. Да практически на всех хостингах давно уже как минимум 5.2+, а в большинстве 5.3+

    DateTime - это не плюшка, а часть ядра и очень упрощает подобные задачи и очень значительно сокращает код ;)

    А вот это очень хорошо. Задачи бывают схожие, но подходы разные. Всегда у человека должен быть выбор =)
     
  20. Andrey_Go

    Andrey_Go Активный пользователь

    С нами с:
    11 окт 2012
    Сообщения:
    6
    Симпатии:
    0
    Это так, согласен.Тут наверно сказывается привычка писать под все версии, плюс мне интересен сам процесс решения. А найти что-то готовое всегда можно, для этого есть старый добрый Google )

    Спасибо за Ваш пример!
     
  21. Gold Dragon

    Gold Dragon Активный пользователь

    С нами с:
    30 сен 2012
    Сообщения:
    306
    Симпатии:
    2
    Адрес:
    Тамбов
    А я вот с этой привычкой стал бороться.. Уходит уйма времени и только для того, чтобы какой-то мизерный процент пользователей на 2-м пентиуме под 95-й виндой смог посмотреть моё творение. И чтобы найти готовое, сначала это готовое кто-то должен написать =)
     
  22. Andrey_Go

    Andrey_Go Активный пользователь

    С нами с:
    11 окт 2012
    Сообщения:
    6
    Симпатии:
    0
    Приму это за совет :)
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    В случае с пхп это даже не процент пользователей, а вобще бессмылица. Ибо возьми да поставь новый пхп на сервак и юзай плюшки =)
     
  24. Andrey_Go

    Andrey_Go Активный пользователь

    С нами с:
    11 окт 2012
    Сообщения:
    6
    Симпатии:
    0
    Нет, вот тут вы сильно заблуждаетесь. На крупных проектах и не очень смена версии ПХП может привести в многочисленным проблемам. Особенно если проект работает давно.
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    "на крупных проектах" должно найти деньжат чтобы идти в ногу со временем, иначе конкуренты их сожрут. Так что это только вопрос жадности.