Разбор временной строки в переносимом с ++ - PullRequest
2 голосов
/ 06 декабря 2011

Кто-нибудь может предложить более хороший способ написания следующего фрагмента кода?

Я бы хотел не использовать boost::time, так как это вызывает проблемы со связыванием, и не могу использовать strptime(), потому что я нахожусь на msvc.

#include <ctime>

int strtomonth(string s)
{
    const char *months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
    for (int i=0;i<12;i++)
        if (strcmp(months[i],s.c_str())==0)
            return i;
    return -1;
}

time_t get_compilation_time()
{
    stringstream s;
    s << __TIMESTAMP__; // formatted like "Tue Dec  6 13:42:54 2011"
    string weekday,month;
    int day,h,m,sec,year;
    char colon;
    s >> weekday >> month >> day >> h >> colon >> m >> colon >> sec >> year;

    tm compile_time;
    compile_time.tm_sec = 0;
    compile_time.tm_min = 0;
    compile_time.tm_hour = 0;
    compile_time.tm_mday = day;
    compile_time.tm_mon = strtomonth(month);
    compile_time.tm_year = year-1900;
    compile_time.tm_isdst = 0;
    compile_time.tm_wday = 0;
    compile_time.tm_yday = 0;

    time_t cmptime = mktime(&compile_time);
    return cmptime;
}

(Я ценю, что в этом случае я мог бы сделать шаг перед сборкой в ​​python или аналогичный, чтобы создать «buildtime.h» и сэкономить мне вычисления во время выполнения, но так как это теперь работает, и накладные расходы не проблема, я буду придерживаться его).

Но ... инициализация структуры в стиле C с неопределенным поведением, если я ошибаюсь, ссылки на то, что должно быть чисто функциональным фрагментом кода, объявление переменных, которые отбрасываются, разбор строк месяца себя . .. тьфу! Есть ли лучший способ?

Ответы [ 2 ]

4 голосов
/ 06 декабря 2011

Но ... Инициализация структуры в стиле C с неопределенным поведением, если я ошибаюсь, ссылки на то, что должно быть чисто функциональным фрагментом кода, объявление переменных, которые отбрасываются, синтаксический анализ строк месяца сам ... черт! Есть ли лучший способ?

Да! Используйте внешнюю библиотеку. (как boost::time)

Я бы хотел избежать использования boost :: time, поскольку это вызывает проблемы с линковкой

Существует тонна документации для запуска / компиляции boost, это действительно не так сложно.

У вас всегда есть компромисс между ссылками на существующие библиотеки или написанием их самостоятельно. Вы должны выбрать, какая опция имеет более низкие накладные расходы / более высокий коэффициент усиления.

2 голосов
/ 06 декабря 2011

Возможно, вы захотите взглянуть на фасет 'time_get', который находится в стандартной библиотеке C ++. http://www.cplusplus.com/reference/std/locale/time_get/

Предоставляет некоторые функции для разбора даты и времени. Вы можете увидеть минимальные примеры на:

http://www.cplusplus.com/reference/std/locale/time_get/get_monthname/

http://www.cplusplus.com/reference/std/locale/time_get/get_weekday/

Это довольно скромная реализация, которая может не соответствовать всем вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...