我有一個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