2011-03-21 200 views
10

有誰知道如何從ISO-8601格式的日期/時間字符串去time_t? 我使用C++,它需要在Windows和Mac上工作。如何在C++中將ISO 8601字符串轉換爲time_t?

我已經寫了代碼,但我確定有一個更「標準」的版本。

我會得到一個像2011-03-21 20:25這樣的日期,我必須告訴我們時間是在過去還是未來。

+2

有大約一個跨平臺的類似的討論'strptime' [這裏](http://stackoverflow.com/questions/321849/strptime當量-上視窗)。你可能想要ravenspoint的答案,並使用boost:'#include「boost/date_time/posix_time/posix_time.hpp」' – Tim 2011-03-21 21:23:34

回答

6

您可以使用strptime從字符串轉換爲struct tm,然後你可以使用mktimestruct tm轉換爲time_t。例如:

// Error checking omitted for expository purposes 
const char *timestr = "2011-03-21 20:25"; 
struct tm t; 
strptime(timestr, "%Y-%m-%d %H:%M", &t); 
time_t t2 = mktime(&t); 
// Now compare t2 with time(NULL) etc. 
+2

strptime不是標準c。它可以在Windows上使用嗎? – 2011-03-21 21:12:34

+1

@Null Set:哎呀,你是對的,忘了那個。 'strptime'僅由POSIX定義。請參閱http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows和http://stackoverflow.com/questions/667250/strptime-in-windows。 – 2011-03-22 18:32:22

7

一個醜陋的黑客我以爲會很有趣:因爲你只需要確定哪些日期/時間是更大的,你可以將日期轉換爲字符串和比較字符串。 ;-)(好處是你不需要strptime這是不是隨處可見。)

#include <string.h> 
#include <time.h> 

int main(int argc, char *argv[]) 
{ 
    const char *str = "2011-03-21 20:25"; 
    char nowbuf[100]; 
    time_t now = time(0); 
    struct tm *nowtm; 
    nowtm = localtime(&now); 
    strftime(nowbuf, sizeof(nowbuf), "%Y-%m-%d %H:%M", nowtm); 
    if (strncmp(str, nowbuf, strlen(str)) >= 0) puts("future"); else puts("past"); 
    return 0; 
} 
+3

雖然我本能地對這樣一個想法感到畏懼......這就是「YYYYMMDD HHMMSS」格式的要點 - ascii比較實際上起作用。當然,風險是如果他將來以不同的格式獲得日期。 – Tim 2011-03-21 21:19:47

相關問題