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

    +162

    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
    if ( ! function_exists('days_in_month'))
    {
    	function days_in_month($month = 0, $year = '')
    	{
    		if ($month < 1 OR $month > 12)
    		{
    			return 0;
    		}
    	
    		if ( ! is_numeric($year) OR strlen($year) != 4)
    		{
    			$year = date('Y');
    		}
    	
    		if ($month == 2)
    		{
    			if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))
    			{
    				return 29;
    			}
    		}
    
    		$days_in_month	= array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    		return $days_in_month[$month - 1];
    	}
    }

    разработчики CodeIgniter не ищут лёгких путей
    date('t')

    Запостил: DrFreez, 19 Сентября 2010

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

    • Простите, а для чего "...$year % 400..." и "...$year % 100..."?
      Ответить
      • special black magic
        Ответить
        • ...однакож...
          Ответить
          • определение високосного года...
            *ухты, високосный пишется через "и" О_о*
            Ответить
          • только непонятно, зачем делать двойную проверку

            ($year % 4 == 0 AND $year % 100 != 0)
            - этой вполне достаточно =)
            Ответить
            • Потому что 2000 год високосный, а по Вашему условию он будет не високосным
              Ответить
              • дада, я пока домой ехал дошёл до этого =)
                Ответить
      • Из определения високосного года

        Год является високосным, если он кратен 4 и при этом не кратен 100, либо кратен 400
        Ответить
        • вот, а то всё школота да школота... тут с календарём-то полторы тыщи лет разбирались...
          Ответить
    • Если чего-то не знаете, то лучше промолчать.

      Скажите, как Вы проверите количество дней в месяце, например, в 1955 или 2658 году с помощью date('t')?
      Ответить
      • признайтесь, вы один из команды разрабов CodeIgniter :)
        если так мыслить, то по идее ребята должны были тогда уж написать костылей для всех функций даты.

        пысы
        [21:25:57] drfreez@korriban:~$ php -r "echo date('c t', mktime(21, 24, 36, 2, 20, 2658)).\"\n\";"
        2658-02-20T21:24:36+08:00 28
        [21:26:33] drfreez@korriban:~$ php -r "echo date('c t', mktime(21, 24, 36, 2, 20, 1955)).\"\n\";"
        1955-02-20T21:24:36+08:00 28
        [21:26:45] drfreez@korriban:~$ php -r "echo date('c t', mktime(21, 24, 36, 2, 20, 2004)).\"\n\";"
        2004-02-20T21:24:36+08:00 29
        [21:26:50] drfreez@korriban:~$ php -r "echo date('c t', mktime(21, 24, 36, 2, 20, 2010)).\"\n\";"
        2010-02-20T21:24:36+08:00 28
        [21:26:53] drfreez@korriban:~$ php -r "echo date('c t', mktime(21, 24, 36, 2, 20, 2660)).\"\n\";"
        2660-02-20T21:24:36+08:00 29
        Ответить
        • на 64 битах :-[
          Ответить
        • Признаюсь - нет.

          Date работает с Unix Timestamp - это количество секунд прошедших с начала эпохи (1.1.1970 года), а так как это целочисленное значение, то ограничено 2038 годом. Если у Вас комп 64-х битный, то тогда может и намного больше - хватит на несколько сотен или тысяч лет вперед.
          Отрицательные значения (т.е. до 1970 года) до PHP5.1 не поддерживалось Windows и, я полагаю, тоже ограничены в районе 1900 годом (для 32-х битных систем).

          Надеюсь теперь понятно, почему это функция не говнокод.
          Ответить
          • Для 64-битных систем unix timestamp хватит на 29 247 120 867 лет - короче выше крыши на время существования нашей солнечной системы :)
            Ответить
            • >на время существования нашей солнечной системы
              А о потомках вы подумали ? Что за безответственность :))
              Ответить
              • Если они не переселятся в другие звездные системы, то не будет уже никаких потомков. А если переселятся, то или начнут заново летосчисление, или будут системы хотя бы 128-битные, а этого хватит на время существования Вселенной. Я все продумал ;)
                Ответить
    • а как по мне - код хороший. проверки толковые. функция компактная, рабочая даже if ( ! function_exists('days_in_month')) сделано.

      разве что array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) - куда -нить поглобальней вынести или брать уже готовое. но это не критично

      судя по всему многие плюсовали по незнанию зачем это
      if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0))

      Edit: БЛЯЯ. промахнулся и тоже плюсанул.
      -2 мне и коду
      Ответить
      • Массив надо было static делать.
        Ответить
      • Твой массив раз в 4 года перестает быть полезным
        Ответить
    • -Да, мамочка, ты классная блядь! Юрка принялся целовать маму взасос…
      Ответить

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