C++日期时间解析

3
我将使用strptime把日期字符串转换成tm数据结构。但我遇到一个问题:
我的日期格式如下:
Thu Dec 13 23:44:45 MSK 2012

我使用"%a %b %d %T"格式字符串解析Thu Dec 13 23:44:45。但我无法理解如何解析年份。我不能仅使用"%a %b %d %T MSK %Y",因为我需要一个与本地环境无关的解析器。
我是否可以跳过MSK这个词?或者有其他方法来解决这个问题呢?

1
@Just_Mad 看起来 %Z 只在 glibc 中有效。 - Karthik T
@Just_Mad 看起来是对的,但是它不起作用 :( - Igor Ryzhov
1个回答

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结构字段,mktime会填充其余字段:tm_wdaytm_ydaytm_isdst

您应该这样调用它:

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

1
你应该检查sscanf的返回值,并在sscanf格式字符串中为char数组指定宽度。如果不这样做,该函数就会成为一个微妙的内存破坏错误(或更糟糕的是,等待被利用的安全漏洞)。一个多疑的程序员还会将char数组预先初始化为{0},这样可以确保在出现意外代码执行流时字符串始终以空字符结尾,这样最安全。 - hyde
为什么需要将“datetime”结构传递给此函数?您可以在函数内部填充所有结构字段,为什么它不能在函数内部创建和销毁? - Just_Mad
@Just_Mad 我需要同时拥有time_t和struct tm时间表示。 - Igor Ryzhov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接