序列化和反序列化时间后的结果不正确
这个小程序重现了我的项目中的错误。 time_t变量转换为struct_tm,然后转换为字符串,并序列化为文件。 稍后,该字符串将从该文件加载,并应该转换回time_t。 结果time_t与原始时间相差一小时(可能是由于夏令时)。 我只能更改反序列化部分,因为文件格式应该保持不变。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
string FormatDateTime(struct tm* time);
void Test();
int _tmain(int argc, _TCHAR* argv[])
{
Test();
return 0;
}
string FormatDateTime(struct tm* time)
{
static const char* months[] =
{
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
char s[30];
const char* month;
if ( time->tm_mon >= 0 && time->tm_mon < 12 )
{
month = months[time->tm_mon];
}
else
{
month = "??";
}
sprintf(s, "%d-%s-%02d %02d:%02d:%02d",
time->tm_year + 1900,
month,
time->tm_mday,
time->tm_hour,
time->tm_min,
time->tm_sec);
return s;
}
void Test()
{
// time_t variable is initialized with current time
time_t t = time(NULL);
// time_t variable is converted to struct tm and then to string
struct tm* ptm = localtime(&t);
char buffer[100];
sprintf(buffer, "%d %d %d %d %d %d",
ptm->tm_mday, ptm->tm_mon + 1, ptm->tm_year + 1900, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
cout << buffer << endl; // string is OK
// string is saved to the file
// *********************************************************************************************
// later this string is restored from the file
// **** I can change something only after this line **** //
struct tm stm;
memset(&stm, 0, sizeof(stm));
sscanf(buffer, "%d %d %d %d %d %d",
&stm.tm_mday, &stm.tm_mon, &stm.tm_year, &stm.tm_hour, &stm.tm_min, &stm.tm_sec);
stm.tm_mon -= 1;
stm.tm_year -= 1900;
string s = FormatDateTime(ptm);
cout << s << endl; // OK
// *********************************************************************************************
// Now I need to convert struct tm to time_t and keep it in the variable
time_t t1 = mktime(&stm); // not the same time - 1 hour difference
if ( t1 == t )
{
cout << "t1 == t" << endl;
}
else
{
cout << "t1 != t !!!!!" << endl;
}
// time_t is printed - result is incorrect
// Utilities::FormatDateTime
struct tm* ptm1 = localtime(&t1);
s = FormatDateTime(ptm1);
cout << s << endl;
}
当地时间是11.33。 结果:
19 7 2012 11 33 17 2012-Jul-19 11:33:17 t1 != t !!!!! 2012-Jul-19 12:33:17
如何更改此程序的最后部分以获得正确的结果?
我的猜测是, tm_isdst在你的两个tm结构中是不同的。 在一个案例中,它是0,在另一个案例中是1。
这不会解决问题,但对于可能在稍后时间0应该代表1970年1月1日而不是1900年的兼容性问题
链接地址: http://www.djcxy.com/p/30815.html上一篇: Incorrect result after serializing and deserializing time
下一篇: Confusion about threads launched by std::async with std::launch::async parameter
