2014-12-08 45 views
2

我試圖日期字符串轉換爲time_t,但mktime()將返回似乎是隨機日期:C++ mktime返回隨機日期

string datetime = "2014-12-10 10:30"; 
struct tm tmInfo; 
strptime(datetime.c_str(), "%Y-%m-%d %H:%M", &tmInfo); 
tmInfo.tm_isdst = 0; 
time_t eventTime = mktime(&tmInfo); 

EVENTTIME從上世紀70年代到21世紀30年代廣泛範圍。 tmInfo結構保存正確的日期,所以錯誤必須在mktime()中發生。任何錯誤的想法?

+0

似乎[爲我工作](http://rextester.com/FRRQ10057)。 'eventTime'作爲'1418203800'出現在右側的球場。 – 2014-12-08 04:11:44

回答

3

在調用strptime()之前,您需要正確初始化struct tm實例的所有其他字段,因爲它不一定會初始化每個字段。從strptime() POSIX specification

它是不確定是否使用相同的TM結構將更新結構的當前內容或覆蓋結構的所有內容多次調用strptime()。符合的應用程序應使用格式和所有需要完整指定轉換日期和時間的數據對strptime()進行一次調用。

例如,這應該足夠了:

struct tm tmInfo = {0}; 
+0

將tmInfo設置爲{0}預先工作,謝謝!由於解釋,我接受了你的答案。 – holdennb 2014-12-08 04:22:17

3

你必須的結構預先或也輸入的秒初始化爲0:

string datetime = "2014-12-10 10:30"; 
struct tm tmInfo = { 0 }; 
strptime(datetime.c_str(), "%Y-%m-%d %H:%M", &tmInfo); 

string datetime = "2014-12-10 10:30:00"; 
struct tm tmInfo; 
strptime(datetime.c_str(), "%Y-%m-%d %H:%M:%S", &tmInfo); 
+0

將tmInfo設置爲{0}預先工作,謝謝! – holdennb 2014-12-08 04:21:51

0

如果你想要當前的系統,下面的代碼可以完成這項工作時間格式

time_t current_time; 
struct tm *loctime; 

memset(buffer,0,strlen(buffer)); 
current_time = time(NULL); 
loctime = localtime(&current_time); 
strftime(buffer,250,"--> %d/%m/%y %H:%M:%S",loctime);