2010-10-29 86 views
3

我有一个char *我想分析一个日期字符串。在这种情况下,一个非常简单的格式:2010-10-28T16:23:31.428226(通用ISO格式)。如何有效地解析日期时间(升压)

我知道增强我可以解析这个,但在一个可怕的代价。我必须创建一个字符串流,可能是一个字符串,然后来回复制数据。有没有什么办法解析char *而不分配任何额外的内存。堆栈对象很好,所以重用堆对象。

任何简单的方法也将是伟大的! ;)

编辑:我需要自纪元以来的微秒结果。

回答

2

有时普通老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); 
+0

哎呀,应该提到我希望在这个纪元以来的微秒结果...虽然我可以直接调用mktime。 – 2010-10-29 07:38:14

+0

是的,我想你会想让strptime(...)为你做大部分的工作,然后用atof(...)或类似的方法拉出浮点秒。还要注意日期例程可能受Unix下TZ环境变量的影响。我假设在Windows下有一个类似的时区事物。我“setenv TZ UTC”来避免这个问题。 – xscott 2010-10-29 07:42:35

+0

TZ方面很烦人,我无法从代码中控制它。我已经回到提高date_time并继续:现在看来我可以缓存流和涉及的几个对象。之后我必须对这两种方法进行性能比较。 – 2010-10-29 08:24:35

0

如果它是一个固定的格式,你为什么不走的位置信息优势?

例如,你知道总是,今年是第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填充或者不是...但你知道格式,所以我应该认为它是微不足道的......

比任何库例程显着更快,当然它很脆弱,但如果你可以控制输入,为什么不呢?

+0

xor 0x30的东西很聪明。我以前从未见过。我注意到你停止使用它来扩大秒数字段。 :-) – xscott 2010-10-29 15:56:53

+0

前三行只给出了这个想法!提供整个代码的乐趣在哪里? ;) – Nim 2010-11-01 10:55:07