检测字符串和解析的格式

时间:2016-03-22 11:24:37

标签: c++ string format scanf

我有一个以下格式的字符串:

dateTime =  "2016-03-22T11:10:41.3126731+00:00"

我将其解析为 tm 结构,如下所示:

    struct tm utc;
    int microseconds;

    sscanf_s(dateTime.c_str(), "%04d-%02d-%02dT%02d:%02d:%02d.%d", 
                                &utc.tm_year,
                                &utc.tm_mon, 
                                &utc.tm_mday,
                                &utc.tm_hour,
                                &utc.tm_min,
                                &utc.tm_sec,
                                &microseconds);

但现在我需要以这种格式解析另一个字符串:

dateTime = "3/18/2016 12:00:05 AM -05:00"

我事先并不知道字符串的格式。

检测格式和解析的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

如果您的项目中有Boost,请尝试Date Time库,但您可以遇到不受支持的案例。如果必须使用标准库,请尝试regex提取参数并将其放入struct tm。但是,对于您事先知道格式的情况。要检测格式然后解析需要比这两个库提供的更高级的逻辑,并且它远非琐碎。

答案 1 :(得分:0)

如果您只有这两种格式,并且您知道日期或月份是否排在第一位,则可以很容易地检测出sscanf调用需要使用哪种格式。只需检查第三个字符。是斜线('/')还是数字?

答案 2 :(得分:0)

如果您事先不知道格式,可能能够通过消除过程确定格式。对于“2016年3月18日”,您有“月/日/年”,因为2016年太大而不是一年以外的任何东西,而18太大而无法表示一个月

但是,如果您遇到类似“3/8/10”的问题,那么您根本无法猜测哪个字段应该表示什么。