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

    +161

    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
    static function anyToTimestamp($date) {
    		// 2009-09-03 12:10:55
    		if (preg_match('/^([0-9]{4})\-([0-9]{2})\-([0-9]{2})(?: ([0-9]{2})\:([0-9]{2})\:([0-9]{2}))?$/', $date, $arr)) {
    			$ts = mktime($arr[4], $arr[5], $arr[6], $arr[2], $arr[3], $arr[1]);
    		// 03.04.2008 10:12:11
    		} elseif (preg_match('/^([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})(?: ([0-9]{1,2})\:([0-9]{1,2})(?:\:([0-9]{2}))?)?$/', $date, $arr)) {
    			$ts = mktime($arr[4], $arr[5], $arr[6], $arr[2], $arr[1], $arr[3]);
    			// MySQL timestamp YYYYMMDDHHMISS
    		} elseif (preg_match('/^\d{14}$/', $date)) {
    			$ts = mktime(substr($string, 8, 2), substr($string, 10, 2), substr($string, 12, 2), substr($string, 4, 2), substr($string, 6, 2),
    				substr($string, 0, 4));
    			// PHP timestamp
    		} elseif (is_int($date)) {
    			$ts = $date;
    			// давно заметил, что предыдущее условие не всегда срабатывает. добавил условие ниже. если передается timestamp 100% сработает
    		}elseif(strlen((int)$date)>=10 && is_int((int)$date)) {
    			$ts = $date;
    		}
    
    		return ($ts && $ts!=-1)?$ts:null;
    	}

    Копаюсь как обычно в проекте, а этот довольно большой на протяжении нескольких лет над ним трудились разные программисты.
    Причем бывает читаю смешные комментарии.

    Однако весь смысл не в этом как вы уже поняли.

    Запостил: oooZinka, 14 Января 2014

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

    • Я правильно понимаю что is_int((int)$date) всегда истинно и потому мы просто принимаем все длинные строчки?
      Ответить
      • Мне конструкция strlen((int)$date) взрывает мозг. Что оно вообще делает?
        Ответить
        • Капитан не-лень сообщает, что таки вернёт количество десятичных цифр в числе $date.
          Ход рассуждения.
          1) $date приводится к int по php-правилам (например, "123456shit" = 123456, "shit123456" = 0).
          2) Поскольку strlen принимает не абы что, а строку, число неявно преобразуется в строку.
          3) В строке, полученной из числа, будет столько символов, сколько десятичных цифр содержится в числе после его преобразования.

          А вот в $ts = $date; они к числу преобразование не делают, что может привести к непредсказуемым последствиям.
          Ответить
      • ну да int)$date это приведение к инт
        Ответить

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