【问题标题】:time_t to string back and forth in windowstime_t 在 windows 中来回字符串
【发布时间】:2012-11-30 07:28:10
【问题描述】:

我有两个功能。第一个将 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:我选择这种技术是因为我需要用'-'来格式化日期。

【问题讨论】:

  • mktime() 将 tmvar 视为本地时区的时间(UTC 中的日期可能不同)。您可以改用timegm()。如果您想要当地时间,请尝试 localtime() 而不是 gmtime()
  • 谢谢 Sebastian,这也适用,以及 Lx 建议的更改。

标签: c++ string time


【解决方案1】:

tm_mon"months since January" 进行计数,因此取值范围为 0 到 11。

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


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

【讨论】:

  • 我必须添加 + 1 tmvar.tm_mon = atoi(tim[1].c_str()) - 1; tmvar.tm_mday = atoi(tim[0].c_str()) + 1 ;
猜你喜欢
  • 2016-12-11
  • 2017-04-09
  • 1970-01-01
  • 2021-12-26
  • 2011-10-30
  • 1970-01-01
  • 2010-12-18
  • 2017-07-19
  • 2016-09-15
相关资源
最近更新 更多