2011-08-18 32 views

回答

6

日期格式爲RFC3339給人一種字符串,如更嚴格的版本「2011-08-18T23:31:42Z」

我不能肯定的strptime功能,可處理時區指示符(Z在上面的時間字符串),所以它可能更容易處理你自己的函數內部。它絕對不能處理小數秒,因爲struct tm不處理它們。如果需要,您可以使用struct timespec來存儲小數秒。

可以使用strptime解析出大部分格式的:

struct tm tm; 
time_t t 
char *extra; 
extra = strptime(tmstr, "%C%y-%m-%dT%H:%M:%S", &tm); 
tm.tm_isdst = -1; 
t = mktime(&tm); 

在此之後,多餘的將是輸入tmstr的剩餘部分。這可能包括小數秒,然後將包含時區格式。如果額外以'。'開始只是解析數出與strtod功能:

if(extra && extra[0] == '.') 
{ 
    char *endptr; 
    fraction = strtod(extra, &endptr); 
    extra = endptr; 

    /* use timespec if fractional seconds required */ 
    struct timespec ts; 
    ts.tv_sec = t; 
    ts.tv_nsec = fraction * 1000000000; 
} 

然後額外現在只包含時區符。如果它是'Z'那麼我們就完成了,因爲mktime無論如何給你UTC時間。否則,你會有一個偏移量,例如+03:00,所以您需要按照小時/分鐘的時間修改您的時間。

+0

非常感謝。太棒了。我只需要找出如何在'time_t'保留時間的時候添加'+03:00'。 – hari

+0

明白了。我真的很感謝你的幫助。 – hari

+2

'struct timespec'會比'double'更好地存儲時間戳。後者隨着時間流逝而失去精度,並且不能存儲幾乎肯定以微秒或納秒爲單位的「原始值」的確切表示,而不能存儲一些基數2分數形式的確切表示。 –