time_t在windows中来回串起来

时间:2012-12-12 14:55:24

标签: c++ string time

我有2个功能。第一个将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;

输入: - 2010年12月31日 输出: - 30-01-2011

奇怪的是,我提供的任何日期的差异为1个月。

请告诉我,如果能回到正确的时间。

PS:我选择这种技术是因为我需要用'-'s格式化日期。

1 个答案:

答案 0 :(得分:1)

tm_mon计算"months since January",因此范围从0到11。

您需要从输入月份中减去1。


除此之外,您的代码会泄漏内存:您永远不会free malloc内存。 由于您使用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);