2012-07-19 32 views
0

这个小程序重现了我项目中的错误。 time_t变量转换为struct_tm,然后转换为字符串,并序列化为文件。稍后,该字符串将从该文件加载,并应该转换回time_t。结果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 

如何更改此程序的最后部分以获得正确结果?

+0

这是什么:'如果(时间 - > tm_mon> = 0 &&时间> tm_mon tm_mon]; }' – SingerOfTheFall 2012-07-19 08:35:30

+0

@SingerOfTheFall - 问题被编辑 – 2012-07-19 08:42:32

+0

可以吗?。 't繁殖,它完全适用于我:'19 7 2012 12 45 48 2012-Jul-19 12:45:48 t1 == t 2012-Jul-19 12:45:48' – SingerOfTheFall 2012-07-19 08:46:01

回答

3

我的猜测是,tm_isdst是在你的两个TM结构不同的兼容性问题。在一种情况下其0和在其他1.

0

这不会解决probleme但可能会晚一点时间0应该代表1970年1月1日,而不是1900