如何有效地解析日期时间(提升)

时间:2010-10-29 07:18:47

标签: c++ boost datetime

我有一个char *,其中包含我想要解析的日期字符串。在这种情况下,格式非常简单:2010-10-28T16:23:31.428226(通用ISO格式)。

我知道Boost我可以解析这个,但成本太高了。我必须创建一个字符串流,可能是一个字符串,然后来回复制数据。有没有办法解析char *而不分配任何额外的内存。堆栈对象很好,因此重用堆对象。

任何简单的方法也会很棒! ;)

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

2 个答案:

答案 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填充......但你知道格式,所以我认为它是微不足道的......

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