我有一个以下格式的字符串:
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,
µseconds);
但现在我需要以这种格式解析另一个字符串:
dateTime = "3/18/2016 12:00:05 AM -05:00"
我事先并不知道字符串的格式。
检测格式和解析的最佳方法是什么?
答案 0 :(得分:0)
如果您的项目中有Boost,请尝试Date Time库,但您可以遇到不受支持的案例。如果必须使用标准库,请尝试regex提取参数并将其放入struct tm
。但是,对于您事先知道格式的情况。要检测格式然后解析需要比这两个库提供的更高级的逻辑,并且它远非琐碎。
答案 1 :(得分:0)
如果您只有这两种格式,并且您知道日期或月份是否排在第一位,则可以很容易地检测出sscanf
调用需要使用哪种格式。只需检查第三个字符。是斜线('/'
)还是数字?
答案 2 :(得分:0)
如果您事先不知道格式,可能能够通过消除过程确定格式。对于“2016年3月18日”,您有有“月/日/年”,因为2016年太大而不是一年以外的任何东西,而18太大而无法表示一个月
但是,如果您遇到类似“3/8/10”的问题,那么您根本无法猜测哪个字段应该表示什么。