我使用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
這個詞嗎?或者以其他方式解決問題?
我使用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
這個詞嗎?或者以其他方式解決問題?
我沒有找到答案,所以我寫了我自己的日期時間解析器:
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_wday
,tm_yday
,tm_isdst
。
你應該這樣調用它:
time_t t = timeParse("Thu Dec 13 23:44:45 MSK 2012", &datetime);
)你應該檢查'sscanf'的返回值,並且在'sscanf'格式字符串中爲char數組指定寬度。如果你不這樣做,那麼這個函數是一個微妙的內存損壞等待發生的bug(或者更糟糕的是,等待利用的安全漏洞)。偏執編碼器也會將字符串數組預先初始化爲「{0}」,如果出現意外的代碼執行,保持字符串爲空始終是最安全的流 – hyde
爲什麼有必要將結構「datetime」傳遞給這個函數?你填充函數中的所有結構域,爲什麼它不能被創建和銷燬它? –
@Just_Mad我需要同時擁有time_t和struct tm時間的表示。 –
%A%B%d%T%Z%Y? –
@Just_Mad看來%Z只能在[glibc](http://www.kernel.org/doc/man-pages/online/pages/man3/strptime.3.html)中工作 –
@Just_Mad它看起來應該是正確,但它不起作用:( –