这个小程序再现了我项目中的错误。将time_t变量转换为struct_tm,然后转换为字符串,并序列化为文件。稍后,将从文件中加载此字符串,并应将其转换回time_t。结果time_t与原始时间相差一小时(可能是由于夏时制)。我只能更改反序列化部分,因为文件格式应保持不变。#include“stdafx.h”#include #include #include 使用命名空间std;字符串FormatDateTime(struct tm * time);无效Test();int _tmain(int argc,_TCHAR * argv []){ 测试(); 返回0;}字符串FormatDateTime(struct tm * time){ 静态const char * months [] = { “Jan”,“Feb”,“Mar”,“Apr”,“May”,“Jun”,“Jul”,“Aug”,“Sep”,“Oct”,“Nov”,“Dec” }; 字符s [30]; const char * month; 如果(time-> tm_mon> = 0 && time-> tm_mon { month = months [time-> tm_mon]; } 其他 { month =“??”; } sprintf(s,“%d-%s-%02d%02d:%02d:%02d”, 时间-> tm_year + 1900, 月, 时间-> tm_mday, 时间-> tm_hour, 时间-> tm_min, time-> tm_sec); 返回s;}无效Test(){ // time_t变量使用当前时间初始化 time_t t = time(NULL); //将time_t变量转换为struct tm,然后转换为字符串 struct tm * ptm = localtime(&t); 字符缓冲区[100]; sprintf(buffer,“%d%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 //字符串保存到文件 // **************************************************** ************************************************** //此字符串从文件中恢复 // ****只有在此行之后我才能更改某些内容**** // struct tm stm; memset(&stm,0,sizeof(stm)); sscanf(buffer,“%d%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; 字符串s = FormatDateTime(ptm); cout // **************************************************** ************************************************** //现在,我需要将struct tm转换为time_t并将其保留在变量中 time_t t1 = mktime(&stm); //不一样的时间-相差1小时 如果(t1 == t) { cout } 其他 { cout } //打印time_t-结果不正确 //实用工具:: FormatDateTime struct tm * ptm1 = localtime(&t1); s = FormatDateTime(ptm1); cout }当地时间是11.33。结果:19 7 2012 11 33 172012年7月19日11:33:17t1!= t !!!!!2012年7月19日12:33:17如何更改该程序的最后部分以获得正确的结果? 最佳答案 我的猜测是,两种tm结构中的tm_isdst不同。在一种情况下为0,在其他情况下为1。关于c++ - 序列化和反序列化time_t变量后结果不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11556907/
10-11 16:28