1. C++ / Говнокод #15731

    +14

    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
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    string modify( const string & str )
    {
    	if( str.size() == 0 ) return "00";
    	if( str.size() == 1 ) return "0" + str;
    	return string( str.end() - 2, str.end() );
    }
    
    string modify4( const string & str )
    {
    	if( str.size() == 0 ) return "0000";
    	if( str.size() == 1 ) return "000" + str;
    	if( str.size() == 2 ) return "00" + str;
    	if( str.size() == 3 ) return "0" + str;
    	return string( str.end() - 4, str.end() );
    }
    
    string TimeISOFormat( time_t cur )
    {
    	char buf[32];
    	struct tm * timeinfo;
    	timeinfo = localtime ( &cur );
    	strftime(buf, 32, "%y", timeinfo);
    	string year(buf);
    	strftime(buf, 32, "%m", timeinfo);
    	string month(buf);
    	strftime(buf, 32, "%d", timeinfo);
    	string day(buf);
    	strftime(buf, 32, "%H", timeinfo);
    	string hour(buf);
    	strftime(buf, 32, "%M", timeinfo);
    	string minute(buf);
    	strftime(buf, 32, "%S", timeinfo);
    	string second(buf);
    	return modify4( year ) + "-" + modify( month ) + "-" + modify( day ) + "T" + modify( hour )+ ":" + modify( minute )+ ":" + modify( second );
    }
    
    string CurrentTimeISOFormat()
    {
    	time_t cur = CurrentTime();
    	char buf[32];
    	struct tm * timeinfo;
    	timeinfo = localtime ( &cur );
    	strftime(buf, 32, "%y", timeinfo);
    	string year(buf);
    	strftime(buf, 32, "%m", timeinfo);
    	string month(buf);
    	strftime(buf, 32, "%d", timeinfo);
    	string day(buf);
    	strftime(buf, 32, "%H", timeinfo);
    	string hour(buf);
    	strftime(buf, 32, "%M", timeinfo);
    	string minute(buf);
    	strftime(buf, 32, "%S", timeinfo);
    	string second(buf);
    	return modify4( year ) + "-" + modify( month ) + "-" + modify( day ) + "T" + modify( hour )+ ":" + modify( minute )+ ":" + modify( second );
    }
    
    time_t CurrentTime()
    {
    	time_t rawtime = 0;
    	time(&rawtime);
    	return rawtime;
    }

    Запостил: brainiac, 11 Апреля 2014

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

    • Прекрасно, сегодня 0014-04-11T19:26:12 судя по этому коду.
      Самое смешное, что кодер знает про strftime, но всё равно делает всё через жопу.

      И какой смысл в функции CurrentTime()? В чём её принципиальное отличие от time_t x = time();
      Ответить
      • time_t x = time(NULL);
        Если быть педантом.

        Чувак просто ман по time()/strftime() не дочитал до конца ;)
        Ответить
      • В CurrentTime() есть минимальный смысл, это все из кода самописной библиотеки, она там для общности и полноты интерфейса. Но ведь даже она зачем-то из трех строк вместо одной.
        Ответить
        • А CurrentTimeISOFormat() тоже для полноты интерфейса? Почему не значение по умолчанию или TimeISOFormat(CurrentTime())? Или хотя бы вызов TimeISOFormat() внутри.
          Ответить
    • Не ну я понимаю еще на жопоскрипте такое писать... ибо там нет нормальных функций для форматирования дат... Но на си/крестах то зачем...

      Ну и тем более делать 2 одинаковых функции ;)
      Ответить
    • P.S. Кстати неприлично выводить локальное время без таймзоны...
      Ответить
      • Итак, окончательный вариант: http://ideone.com/SchvrC

        Конечно, для годов > 99 999 999 999 или < -9 999 999 999 произойдёт переполнение буфера
        Ответить
        • > return {buf}
          Нафига скобочки?
          Ответить
          • Привычка, отказ от неявных преобразований. Скобочки показывают «Конструируем строку из сишной строки». На С++03 писал бы std::string(buf)
            Ответить
            • Ясно. std::string(buf) - ну вот этот вариант как-то привычней...
              Ответить
        • Самая жопа в strftime/localtime - нельзя указать локаль/таймзону при вызове ;(
          Ответить
          • Локаль можно:
            std::ostringstream out;
            out.imbue(std::locale("ja_JP.utf8"));
            out << std::put_time(std::localtime(std::time(nullptr)), "%FT%T%z");
            return out.str();
            (Хотя в данном случае — вывод по ISO8601 — это бессмысленно ибо locale independed)
            А с таймзоной жопа. Причём %z в коде судя по всему не делает ничего полезного: в локали таймзона не хранится, tm содержит только is_dst.
            Вот не могли они сделать нормальный класс для работы со временем? Приходится использовть мутные сишные функции с глобальным состоянием.
            Ответить
            • boost::locale::generator gen;
              std::cout.imbue(gen("ru_RU.utf-8"));
              
              namespace as = boost::locale::as;
              std::cout << as::ftime("%Y-%m-%dT%T%Z %a %b") << as::time_zone("Asia/Omsk") << time(0) << std::endl;
              Но есть одно но... Они какого-то хуя додумались локализовать таймзоны... И этот код выведет:
              2014-04-12T01:21:48Время по Омску сб апр
              Практически идеальное решение, и такой былинный отказ... Можно, конечно, написать as::time_zone("Etc/GMT-7") вместо имени таймзоны (%Z выведет его как +07:00), но потеряем расчет DST :(
              Ответить
              • То есть до %z как в С++11 функциях они не додумались. Да и %F или аналог отсутствует. Интересно, они допиливать это собираются.
                Ответить
                • Сам возьми и допили, лалка. Буст опенсорсный и сделать мир лучше может каждый в этом мире.
                  Ответить
    • Посанчики, чем посоветуете парсить на крестах с С++11, бустом и Qt строку вида:
      [{"value":"0", "min":"-5", "max":"200"}, {"value":"5", "max":"200"}]
      Ответить
      • Ну я бы выбрал boost::property_tree или QJsonDocument.

        У ускорение::древо_свойств интерфейс очень приятный, особенно если с++11 можно юзать.
        Ответить
        • А какие плюсы даёт с++11 для ускорения дерева свойств?
          Анон, который меня это спрашивал говорит что ускорение дерева свойств просит какие-то именованные объекты Ясон вместо тех неименованных что ему подсунули. Я хз что это значит, но могу у него спросить подробностей и во вторник рассказать.
          И подозреваю тут замкнутый круг. чтобы именовать объекты нужно их разобрать, чтобы их разобрать нужно их именовать. в любом случае тут вечная бустоболь ожидается
          Ответить
          • > А какие плюсы даёт с++11
            Оббегать ноды удобней из-за кресто11блядского for'а.

            > вечная бустоболь ожидается
            Да не, все там нормально. Я и массивы и объекты разбирал. Могу примеров подкинуть, если интересно.
            Ответить
            • Давай примеры. Я потом тому анону ссылку на тхред дам.
              Ответить
              • Имена и значения изменены до неузнаваемости, все совпадения случайны :)
                // json
                {
                    "some": [
                        { "object": "t1", "a": 1, "b": 2 },
                        { "object": "t2", "a": 1 }
                    ],
                    ...    
                }
                
                // load
                boost::property_tree::ptree tree;
                boost::property_tree::json_parser::read_json(filename, tree);
                
                // parse
                for (auto &it : config.get_child("some")) {
                    some m;
                    m.type = object_types::get(it.second.get<std::string>("object"));
                    m.a = it.second.get<int>("a");
                    m.b = it.second.get<int>("b", 1);
                    somes.push_back(some);
                }
                Ответить
                • Спасибо. Предложу ему добавить имя объекта вручную.
                  Ответить
                  • перед парсингом
                    Ответить
                    • Дык необязательно ;)

                      Твой [{...}, {...}] можно разобрать примерно так:
                      boost::property_tree::ptree tree;
                      boost::property_tree::json_parser::read_json(filename, tree);
                      
                      for (auto &it : tree) {
                          some m;
                          m.type = object_types::get(it.second.get<std::string>("object"));
                          m.a = it.second.get<int>("a");
                          m.b = it.second.get<int>("b", 1);
                          somes.push_back(some);
                      }
                      Ответить

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