2012-12-17 140 views
3

我使用strptime来解析日期时间字符串到tm结构。 但我面临一个问题:C++日期时间解析

我有日期的格式如下:

Thu Dec 13 23:44:45 MSK 2012 

我解析Thu Dec 13 23:44:45"%a %b %d %T"格式字符串。 但我不明白如何解析一年。我不能只使用"%a %b %d %T MSK %Y",因为我想要独立于语言环境的解析器。

我可以跳过MSK这个词吗?或者以其他方式解决问题?

+0

%A%B%d%T%Z%Y? –

+1

@Just_Mad看来%Z只能在[glibc](http://www.kernel.org/doc/man-pages/online/pages/man3/strptime.3.html)中工作 –

+0

@Just_Mad它看起来应该是正确,但它不起作用:( –

回答

3

我没有找到答案,所以我写了我自己的日期时间解析器:

time_t timeParse(const char *string, struct tm *datetime) 
{ 
    char dn[4], mn[4], ln[4]; 
    int d, h, m, s, y; 
    sscanf(string, "%s %s %d %d:%d:%d %s %d", dn, mn, &d, &h, &m, &s, ln, &y); 
    datetime->tm_sec = s; 
    datetime->tm_min = m; 
    datetime->tm_hour = h; 
    datetime->tm_mday = d; 
    if (!strcmp(mn, "Jan")) datetime->tm_mon = 0; 
    if (!strcmp(mn, "Feb")) datetime->tm_mon = 1; 
    if (!strcmp(mn, "Mar")) datetime->tm_mon = 2; 
    if (!strcmp(mn, "Apr")) datetime->tm_mon = 3; 
    if (!strcmp(mn, "May")) datetime->tm_mon = 4; 
    if (!strcmp(mn, "Jun")) datetime->tm_mon = 5; 
    if (!strcmp(mn, "Jul")) datetime->tm_mon = 6; 
    if (!strcmp(mn, "Aug")) datetime->tm_mon = 7; 
    if (!strcmp(mn, "Sep")) datetime->tm_mon = 8; 
    if (!strcmp(mn, "Oct")) datetime->tm_mon = 9; 
    if (!strcmp(mn, "Nov")) datetime->tm_mon = 10; 
    if (!strcmp(mn, "Dec")) datetime->tm_mon = 11; 
    datetime->tm_year = y - 1900; 
    return mktime(datetime); 
} 

我手动tm structure领域填写必要和mktime填写其余字段:tm_wdaytm_ydaytm_isdst

你应该这样调用它:

time_t t = timeParse("Thu Dec 13 23:44:45 MSK 2012", &datetime); 
+1

)你应该检查'sscanf'的返回值,并且在'sscanf'格式字符串中为char数组指定宽度。如果你不这样做,那么这个函数是一个微妙的内存损坏等待发生的bug(或者更糟糕的是,等待利用的安全漏洞)。偏执编码器也会将字符串数组预先初始化为“{0}”,如果出现意外的代码执行,保持字符串为空始终是最安全的流 – hyde

+0

为什么有必要将结构“datetime”传递给这个函数?你填充函数中的所有结构域,为什么它不能被创建和销毁它? –

+0

@Just_Mad我需要同时拥有time_t和struct tm时间的表示。 –