2010-10-29 40 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