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

    +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
    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
    $sec_in_year = 31536000;
    $sec_in_lyear = 31622400;
    $sec_in_28 = 2419200;
    $sec_in_29 = 2505600;
    $sec_in_30 = 2592000;
    $sec_in_31 = 2678400;
    $sec_in_day = 86400;
    $sec_in_hour = 3600;
    $sec_in_min = 60;
    $year_count = 1970;
    $month_count = 0;
    $day_count = 1;
    $hour_count = 0;
    $min_count = 0;
    $lyear_count = 2;                                                // Make an array of seconds per month for ease of use.
    $months = array(2678400, 2419200, 2678400, 2592000, 2678400, 2592000, 2678400, 2678400, 2592000, 2678400, 2592000, 2678400);
    $lmonths = array(2678400, 2505600, 2678400, 2592000, 2678400, 2592000, 2678400, 2678400, 2592000, 2678400, 2592000, 2678400);
    $month_list = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec');
    
    while($utime >= $sec_in_year) {                        // Count the year since 1970.
            if($lyear_count % 4 == 0) {
              $utime -= $sec_in_lyear;                // Compensate for leap years.
            }
            else {
              $utime -= $sec_in_year;
            }
            $year_count++;
            $lyear_count++;
    }
    while($utime >= $months[$month_count]) {        // Count the months since Jan.
            if($lyear_count % 4 == 0) {
                    $utime -= $lmonths[$month_count];        // Compensate for leap year Feb.
            }
            else {
                    $utime -= $months[$month_count];
            }
            $month_count++;
    }

    И еще куча строк кода.
    Конвертим никсовый временной штамп, в читаемый для человека формат... aka date()

    Запостил: fork, 07 Декабря 2010

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

    • Зачетное говно
      Ответить
    • "Nothing is going to build your application for you, no matter what it promises. You are going to have to build it yourself" (c)

      достойные ученики лердорфа)
      Ответить
    • Нахрена константы заранее сосчитали, непонятно же теперь нихрена? Типа чтобы снизить нагрузку на интерпретатор?
      Ответить
      • да, пыховцы любят порассуждать, что константа быстрее переменной, а потом идут, и делают 42 запроса с louter join по varchar(255) на каждый заход на сайт)))
        Ответить
        • То есть вы исключаете вариант, что поле, по которому объединяются таблицы, может быть проиндексировано и тогда не имеет значение что в нём внутри, varchar или tinyint?
          Ответить
          • представьте себе сколько занимает индекс для tinyint и с какой скоростью он работает
            теперь тоже самое для varchar в UTF-8, например со словом "товары для дома"
            Ответить
            • я же не говорю что это хорошо :) Но случаи когда можно использовать char или varchar небольшой длины всё же есть, в виде исключений :)
              Ответить
              • например?)
                Ответить
                • код страны или код языка
                  Ответить
                  • код языка явно будет лежать в отдельной таблице
                    что мешает связаться с ней по id?

                    хотя в целом ладно: если там действительно char(2), да еще однобайтовая кодировка -- то это не смертельно.

                    Вы еще пропустили шпильку про аутерджойн.
                    Невероятно, но некоторые не знают про внутренние джойны. Они знают только одну конструкцию, и называют ее "лефтджойн". И юзают везде, даже где не надо
                    Ответить
                    • Код языка может лежать в отдельной таблице, но во-первых зачем языку уникальный другой уникальный индекс, ведь один у него есть, во-вторых так нагляднее и не надо таскать лишнюю таблицу в каждом запросе, ведь из неё только код языка и нужен.
                      Естественно хранится как char(2), только вот кодировка особо значение не имеет, главное чтобы была _bin

                      А по поводу лефт-джоина в целом согласен, но иногда очень не хватает full outer, приходится извращаться
                      Ответить
                      • >> только вот кодировка особо значение не имеет
                        если unicode четырехбайтовый -- имеет)
                        Ответить
    • Ну стоит изменить проверку с
      if($lyear_count % 4 == 0)
      на
      if($lyear_count % 4 == 0 && ($lyear_count % 100 != 0 || $lyear_count % 400 == 0))

      А также добавить заранее просчитанный массивчик $seconds_in_days [year][month][day], чтобы еще учитывать даты перехода на летнее время и обратно, с 70го и на ближайшие лет 10 :D
      Ответить
      • о, вспоминаю я классику алгоритмов, Вечный Календарь ))))
        Ответить
      • "А также добавить заранее просчитанный массивчик $seconds_in_days [year][month][day]"

        Нет, не надо: два перевода часов в году компенсируют друг друга.
        Сначала у нас день на час короче (23 часа) (переход на летнее время), потом у нас день на час длиннее (25 часов) (переход на зимнее время).
        Ответить
        • да, но для правильного расчета надо, ибо время будет неправильным, а если оно в промежутке часа от 00:00, то и день ;-)
          Ответить
          • для правильного расчёта чего?
            Ответить
            • даты :) из временной метки и обратно
              Ответить
              • для временной метки надо использовать время без перевода часов (время GMT), вы со мной согласны?
                Ответить
                • Для метки да, но при отображении надо показывать в нужном часовом поясе с поправкой на DST, вы со мной согласны?
                  Ответить
                • куку, GMT страдает DST, поэтому от него уже давно отказались (а не потому что среднему программисту с пиндостанских равнин тяжело понять что такое Гринвич)
                  Ответить
                  • я имел в виду время GMT по 0 часовому поясу без переводов часов.
                    Ответить
                    • это называется всемирное время, в просторечии UTC
                      общеобразовательный курс астрономии как бы
                      Ответить
                      • UTC — это не GMT, это подправленное GMT.
                        ===
                        Но, грубо, UTC — это время GMT по нулевому часовому поясу без переводов часов.
                        Ответить

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