2012-12-24 80 views
0

是否有一種常見的,方便的跨平臺方法,用於將格式字符串「HH:MM:SS。<小數第二個>」轉換爲timedelta)數字類型,反之亦然在C或C++?C++將「HH:MM:SS.fraction」轉換爲int64_t

+0

看看這裏,請:http://stackoverflow.com/questions/3414509/date-time-parsing-in-c –

+0

我被告知理解strptime只是POSIX。其他方面呢?至於提升,我將不得不做一些閱讀... – JellicleCat

回答

1

strptime就像它對於這個特定問題的可移植性一樣。它不在C標準庫中(即使自從C89,C99和C2011不再具有比POSIX更便攜的特性(即使這麼多,微軟)),但它足夠普及,我的建議是編寫代碼,就好像它是普遍的,然後在您的構建系統中檢測到它的缺失並注入替代品。你可以在這裏獲得一個BSD許可的替換:http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD(可能需要可移植性修改)

+1

請注意,既沒有['strftime()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html)格式化也沒有根據POSIX,解析時間的['strptime()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html)支持小數秒。 Linux文檔(例如http://linux.die.net/man/3/strptime)似乎也有此限制。原因是:'struct tm'不會做分數;有很多亞秒格式('struct timespec','struct timeval',...),你需要分子的分子和分母都可用。 –

1

這不是很難(我假設你的時間是機器生成的,而不是手寫的,所以我們可以依賴它被「正確「 - 否則,我們不得不添加一個」這是範圍內的值「檢查)。我也會假設分數始終是相同的數字位數。

int64_t parsetime(char *str) 
{ 
    int hh, mm, ss, fract; 
    int64_t t; 

    if (sscanf(str, "%d:%d:%d.%d", &hh, &mm, &ss, &fract) != 4) 
    { 
     printf("Badly formed time %s\n", str); 
     return -1; 
    } 

    // 1000000 assumes there are 6 digits in fract, and we want microseconds. 
    t = ((hh * 60) + mm *60) + s) * 1000000 + fract; 

    return t; 
} 

你可以做同樣的事情,使用double%d:%d:%lf格式字符串,然後乘上衛浴套間倍增,讓您的分數爲整數形式(例如1000毫秒,1000000微,億爲納秒,等等)

+0

謝謝。我寫了自己的例程,因爲實際上我的格式是'[[HH:] MM:] SS [。 ]' – JellicleCat