[英]Incorrect result after serializing and deserializing time_t variable
這個小程序再現了我項目中的錯誤。 將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結構中的tm_isdst
不同。 在一種情況下為0,在另一種情況下為1。
那不會解決問題,但是對於兼容性問題,以后可能會出現0應該代表1970年1月1日而不是1900年1月1日
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.