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

    +171

    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
    static void tm_to_systemtime(const tm* pTime, LPSYSTEMTIME pSysTime )
    {
    	time_t timeT = mktime((tm*)pTime);
    	FILETIME fTime = {0},lTime = {0};
    	LONGLONG ll = Int32x32To64(timeT, 10000000) + 116444736000000000;
    	fTime.dwLowDateTime = (DWORD) ll;
    	fTime.dwHighDateTime = ll >>32;
    	FileTimeToLocalFileTime(&fTime,&lTime);
    	FileTimeToSystemTime(&lTime,pSysTime);
    }
    
    static std::string GetDateTimeString(const tm& activ)
    {
    	SYSTEMTIME sysTime = {0};
    	tm_to_systemtime(&activ,&sysTime);
    	char str[256];
    	//format to <YYYYMMDDHHMMSS>
    	sprintf_s(str,sizeof(str),"%04d%02d%02d%02d%02d%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
    	return std::string(str);
    }

    далеко не самый скучный способ отформатировать ::tm в виде YYYYMMDDHHmmss

    Запостил: defecate-plusplus, 20 Сентября 2011

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

    • что только не сделают люди, лишь бы не использовать boost
      Ответить
      • показать все, что скрытоboost хунта IMHO
        Ответить
        • буст как раз совсем не ксунта, но в данном случае tm -> posix_time -> time_facet более громоздко, чем просто вывести tm
          Ответить
      • Что только не сделают люди, не знающие C++ (ни даже C).

        man strftime
        Ответить
        • вы имели в виду GetTimeFormat и GetDateFormat?

          10+ лет это дерьмо уже не видел, но все равно еще из кошмаров названия функций всплыли.
          Ответить
          • Нет, впервые о них слышу.
            Ответить
          • у Вас NLS-фобия?
            Ответить
            • нет, просто прелести программирования Win9x в памяти всплыли. другими словами: NLS? нет не слышал. :D
              Ответить
    • давно с виндами не сталкивался. кто нибудь может объяснить назначение функции `tm_to_systemtime`?

      как-то не понятно. если откуда то взялась инстанция `struct tm`, то где-то же должны быть ей родственные `gmtime`, `localtime` & `strftime`.

      переливание одного сплит представления даты в другое выглядит весьма глупо. и разницы между tm и SYSTEMTIME я вижу только в том что DST и GMT-offset в последнем отсутствуют (ы?). которые здесь вроде и не нужны.
      Ответить
      • собственно переливание, да еще и таким способом - всё это и есть сабж
        Ответить
      • ну да, SYSTEMTIME юзает локальное время, вместо хранения оффсета. как и вся винда ;)
        Ответить
        • tm тоже локальное время. оффсет там только для красоты, бо нестандартное поле (но всеми уважающими себя системами (например Линух и БСДя) поддерживается).
          Ответить
        • вообще-то наоборот, винда в основном кладет в SYSTEMTIME время в UTC
          Ответить
          • всем линуксоидам известно, что для того, чтобы на одной машине винда и линукс показывали одно время, hardware time должно быть local, а не UTC.
            Ответить
    • php date: рейтинг -11
      cpp date: рейтинг +5

      все честно!
      Ответить
    • Посчитал преобразования: tm -> time_t -> LONGLONG -> FILETIME -> FILETIME -> LPSYSTEMTIME -> char[]. Вместо вызова одной стандартной библиотечной функции.
      Ответить
      • Оказывается и в 2011 промышлял петух-фаечник.
        Ответить
        • Конкретно чел с ником 'gegMOPO4' сидел на программерсфоруме, я с ним сталкивался. Имею подозрения, что он до сих пор обитает тут, только под другой учёткой.
          Ответить

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