1. PHP / Говнокод #1936

    +148.6

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    class ZDate extends Logic
    
    {
    
    	/**
    
    	 * return age
    
    	 *
    
    	 * @param integer $birthday
    
    	 * @return string
    
    	 */
    
    	public static function getAge($birthday)
    
    	{
    
    		$year = date('Y', $birthday);
    
    		$month = date('m', $birthday);
    
    		$day = date('d', $birthday);
    
    		
    
    		$cur_year = date('Y');
    
    		$cur_month = date('m');
    
    		$cur_day = date('d');
    
    		
    
    		$age = $cur_year - $year;
    
    		
    
    		if ($cur_month < $month) --$age;
    
    		if ($cur_month == $month && $cur_day < $day) --$age;
    
    		
    
    		return (string) $age;
    
    	}
    
    }

    Вот так коллега вычисляет возраст пользователя =)

    Запостил: prostosergik, 05 Октября 2009

    Комментарии (16) RSS

    • А как? На Ваш взгляд как нужно вычислять?
      Ответить
      • В дополнение к вопросу. Единственное, что можно сделать, это сократить на пару строчек, но сам алгоритм расчета верен.
        Ответить
    • мот и не оч красиво но и не говнисто
      Ответить
    • Если программист обращает внимания на дни ($cur_day < $day), то нужно также учитывать и високосные года.
      можно в секунды от 70 года каждую дату приводить. Отнимать от текущей даты дату день рождения. делить полученое на 365 дней.
      Ответить
      • > Если программист обращает внимания на дни ($cur_day < $day), то нужно также учитывать и високосные года.
        Все уже учтено

        > Отнимать от текущей даты дату день рождения. делить полученое на 365 дней.

        Почему на 365, а не на 365.25? Такой способ подойдет, если до дня рождения больше одного-два дня. Из-за високосных годов может быть погрешность около даты рождения
        Ответить
    • public function getAge($timestamp)

      {

      return intval((time() - $timestamp) / 31556926);

      }
      Ответить
      • Говнокод!!!
        См. мой коммент выше около по поводу погрешности около даты рождения
        Ответить
        • А ты проверь ;)
          Ответить
          • Легко. Для наглядности беру не time(), а конкретную дату
            <? 
            function getAge($timestamp){
              $now = mktime(0,0,0,10,5,2014);
              return intval(($now - $timestamp) / 31556926);
            }
            $year = 2007;
            
            $birthday = mktime(0,0,0,10,4,$year);
            print getAge($birthday)."\n";
            
            $birthday = mktime(0,0,0,10,5,$year);
            print getAge($birthday)."\n";
            
            $birthday = mktime(0,0,0,10,6,$year);
            print getAge($birthday)."\n";
            ?>


            меняя
            $now = mktime(0,0,0,10,5,2015);
            $year = 2008;

            Имеем в первом случае (день рождения 5.10.2007) возраст
            4.10.2014 - 7 лет
            5.10.2014 - 7 лет (сегодня - правильный возраст)
            6.10.2014 - 6 лет

            Имеем в втором случае (день рождения 5.10.2008) возраст
            4.10.2015 - 7 лет
            5.10.2015 - 6 лет (о боже, у меня сегодня день рождения, а мне еще 6 лет)
            6.10.2015 - 6 лет
            Ответить
            • С форматирование не угадал
              Может так прокатит
              <? 
              function getAge($timestamp){
                $now = mktime(0,0,0,10,5,2014);
                return intval(($now - $timestamp) / 31556926);
              }
              $year = 2007;
              
              $birthday = mktime(0,0,0,10,4,$year);
              print getAge($birthday)."\n";
              
              $birthday = mktime(0,0,0,10,5,$year);
              print getAge($birthday)."\n";
              
              $birthday = mktime(0,0,0,10,6,$year);
              print getAge($birthday)."\n";
              ?>
              Ответить
              • Хех, ты прав. В високосных годах ошибочка. Передам автору этого кода ( [url=http://govnokod.ru/1936#comment8156]http://govnokod.ru/1936#comment8156[/url] ) что он говонокодер, а код - говно =)
                Ответить
                • Как и обещал, скомпонованная запись функции
                  <?
                  function getAge($timestamp){
                  	return date('Y', time())-date('Y', $timestamp) - (date('m-d', time())<date('m-d', $timestamp));
                  }
                  ?>
                  Ответить
          • Попозже напишу краткий и, главное, правильный вариант для расчета возраста. Принцип будет такой же, но все вместится в одну строку
            Ответить
    • http://ru2.php.net/manual/en/datetime.diff.php
      Долой велосипеды!
      Ответить

    Добавить комментарий