【发布时间】: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 建议的更改。