我有一个char *
,其中包含我想要解析的日期字符串。在这种情况下,格式非常简单:2010-10-28T16:23:31.428226
(通用ISO格式)。
我知道Boost我可以解析这个,但成本太高了。我必须创建一个字符串流,可能是一个字符串,然后来回复制数据。有没有办法解析char *
而不分配任何额外的内存。堆栈对象很好,因此重用堆对象。
任何简单的方法也会很棒! ;)
编辑:我需要自纪元以来的微秒结果。
答案 0 :(得分: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);
答案 1 :(得分:0)
如果它是固定格式,为什么不利用位置信息?
例如,您知道总是年份是前四个字符,所以:
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填充......但你知道格式,所以我认为它是微不足道的......
显着快于任何库例程,当然它非常脆弱,但如果你可以控制输入,为什么不呢?