2012-12-12 53 views
1

我有2個函數。首先將time_t轉換爲字符串。第二個字符串爲time_t。 我只需要將日期轉換並恢復爲字符串。time_t在窗口中來回拖動

的功能是

void split(const string &s, char delim, vector<string>& elems) { 
    stringstream ss(s); string item; 
    while(getline(ss, item, delim)) { elems.push_back(item);} return; 
} 

time_t getDateInTimeTfromHyphenSplitString(string s) 
{ 
    struct tm tmvar = {0}; 
    vector<string> tim; 
    split(s.c_str(),'-',tim); 
    tmvar.tm_year = atoi(tim[2].c_str()) - 1900; 
    tmvar.tm_mon = atoi(tim[1].c_str()); 
    tmvar.tm_mday = atoi(tim[0].c_str()); 
    tmvar.tm_isdst = 0; 
    time_t ttm = mktime(&tmvar); 
    return ttm; 
} 

string getDateInHyphenSplitStringfromTimeT(time_t t) 
{ 
    struct tm *timeinfo = (tm*)malloc(sizeof(tm)); 
    gmtime_s(timeinfo, &t); 
    char *buffer = NULL; 
    buffer = (char*)malloc((size_t)20); 
    strftime(buffer, 20, "%d-%m-%Y", timeinfo); 
    string s = buffer ; 
    return s; 
} 

現在,當我有以下行測試此代碼放出來似乎有點奇怪。

string sk = "31-12-2010"; 
cout << sk << endl; 
time_t ttk = getDateInTimeTfromHyphenSplitString(sk); 
sk = getDateInHyphenSplitStringfromTimeT(ttk); 

cout << sk << endl; 

輸入: - 31-12-2010 輸出: - 30-01-2011

奇怪的是我正在爲我提供作爲輸入的任何日期起計1月的差異。

請讓我知道,如何得到正確的時間回來。

PS:我選擇這種技術,因爲我需要用' - '格式化日期。

+1

mktime()可治療tmvar爲本地時區時間(日期可能會在UTC不同) 。您可以使用[timegm()](http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/pkgtools/libnbcompat/files/timegm.c)。如果你想要本地時間,那麼試試localtime()而不是gmtime() – jfs

+0

謝謝Sebastian,它也適用於Lx建議的更改。 – Naresh

回答

1

tm_mon計數"months since January",從而爲價值從0到11

您需要從輸入一個月減1。


除此之外,你的代碼泄漏內存:你永遠不freemalloc版內存。 由於您使用C++進行編程,因此我建議不要完全使用malloc/free,而應該使用 new, new[], delete and delete[],因爲malloc沒有對象的概念,也不調用構造函數。

在你的函數的特殊情況下,你甚至不會需要動態內存分配都:

struct tm timeinfo; 
    gmtime_s(&timeinfo, &t); 
    char buffer[20]; 
    strftime(buffer, sizeof(buffer), "%d-%m-%Y", &timeinfo); 
+0

很酷的工作,但日期現在需要更正。 – Naresh

+0

我必須添加+ 1 \t tmvar.tm_mon = atoi(tim [1] .c_str()) - 1; \t tmvar.tm_mday = atoi(tim [0] .c_str())+ 1; – Naresh