我有一个char *
我想分析一个日期字符串。在这种情况下,一个非常简单的格式:2010-10-28T16:23:31.428226
(通用ISO格式)。如何有效地解析日期时间(升压)
我知道增强我可以解析这个,但在一个可怕的代价。我必须创建一个字符串流,可能是一个字符串,然后来回复制数据。有没有什么办法解析char *
而不分配任何额外的内存。堆栈对象很好,所以重用堆对象。
任何简单的方法也将是伟大的! ;)
编辑:我需要自纪元以来的微秒结果。
我有一个char *
我想分析一个日期字符串。在这种情况下,一个非常简单的格式:2010-10-28T16:23:31.428226
(通用ISO格式)。如何有效地解析日期时间(升压)
我知道增强我可以解析这个,但在一个可怕的代价。我必须创建一个字符串流,可能是一个字符串,然后来回复制数据。有没有什么办法解析char *
而不分配任何额外的内存。堆栈对象很好,所以重用堆对象。
任何简单的方法也将是伟大的! ;)
编辑:我需要自纪元以来的微秒结果。
有时普通老C比较简单。你可以几乎strptime(...)做到这一点:
struct tm parts = {0};
strptime("2010-10-28T16:23:31", "%Y-%m-%dT%H:%M:%S", &parts);
不幸的是,你必须单独抢秒的小数部分。我想你可以用的sscanf(...)也做到这一点:
unsigned int year, month, day, hour, min;
double sec;
int got = sscanf(
"2010-10-28T16:23:31.428226",
"%u-%u-%uT%u:%u:%lf",
&year, &month, &day, &hour, &min, &sec
);
assert(got == 6);
如果它是一个固定的格式,你为什么不走的位置信息优势?
例如,你知道总是,今年是第4个字符,所以:
const char* date = "2010-10-28T16:23:31.428226";
int year = (((date[0]^0x30)) * 1000) + ((date[1]^0x30) * 100) + ((date[2]^0x30) * 10) + (date[3]^0x30);
int month = ((date[5]^0x30) * 10) + (date[6]^0x30);
int day = ((date[8]^0x30) * 10) + (date[9]^0x30);
等
微秒段是有点麻烦,取决于它是否是0填充或者不是...但你知道格式,所以我应该认为它是微不足道的......
比任何库例程显着更快,当然它很脆弱,但如果你可以控制输入,为什么不呢?
哎呀,应该提到我希望在这个纪元以来的微秒结果...虽然我可以直接调用mktime。 – 2010-10-29 07:38:14
是的,我想你会想让strptime(...)为你做大部分的工作,然后用atof(...)或类似的方法拉出浮点秒。还要注意日期例程可能受Unix下TZ环境变量的影响。我假设在Windows下有一个类似的时区事物。我“setenv TZ UTC”来避免这个问题。 – xscott 2010-10-29 07:42:35
TZ方面很烦人,我无法从代码中控制它。我已经回到提高date_time并继续:现在看来我可以缓存流和涉及的几个对象。之后我必须对这两种方法进行性能比较。 – 2010-10-29 08:24:35