在便携式c ++中解析时间字符串

时间:2011-12-06 15:27:08

标签: c++ parsing time

有人能建议一种更好的方法来编写以下代码吗?

我希望避免使用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 个答案:

答案 0 :(得分:4)

  

但是......如果我弄错了,那么带有未定义行为的C风格的结构初始化,引用什么应该是纯粹的功能代码,声明被丢弃的变量,自己解析月份字符串...哎呀!还有更好的方法吗?

是的!使用外部库。 (如boost::time

  

我想避免使用boost :: time,因为这会引发链接问题

有大量的文档可以让boost运行/编译,这真的不是那么难。

您始终需要在链接到现有库或自己编写库之间进行权衡。您必须选择哪个选项具有较低的开销/较高的增益。

答案 1 :(得分:2)

您可能需要查看标准C ++库中的'time_get'facet。 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/

这是一个非常准确的实施方案,可能无法满足您的所有需求。