这是函数
time_t time_from_string(const char* timestr)
{
if (!timestr)
return 0;
struct tm t1;
memset(&t1, 0, sizeof(t1));
int nfields = sscanf(timestr, "%04d:%02d:%02d %02d:%02d:%02d",
&t1.tm_year, &t1.tm_mon, &t1.tm_mday, &t1.tm_hour,
&t1.tm_min, &t1.tm_sec);
if (nfields != 6)
return 0;
t1.tm_year -= 1900;
t1.tm_mon--;
t1.tm_isdst = -1; // mktime should try itself to figure out what DST was
time_t result = mktime(&t1);
return result;
}
当我使用参数“2007:11:14 11:19:07”调用它时,它在Linux中返回1195028347(Ubuntu 12.04,gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3)和1195024747 in Windows(Windows 7,Visual Studio 2010)。
可以看出,时差是3600。
我在同一台计算机上运行两个操作系统(双启动),这是在MSK时区。 两个操作系统都与互联网时间同步,系统时钟显示正确的时间。
当我用另一个参数“2012:08:21 18:20:40”调用此函数时,我在两个系统中都得到了1345558840。
为什么结果在几种情况下有所不同?
修改
忘了提。我在调用mktime()
后控制t1变量的内容。
在两个系统中:
t1.tm_sec = 7;
t1.tm_min = 19;
t1.tm_hour = 11;
t1.tm_mday = 14;
t1.tm_mon = 10;
t1.tm_year = 107;
t1.tm_wday = 3;
t1.tm_yday = 317;
t1.tm_isdst = 0;
请提及最后一行。两个系统都确定实际上没有夏令时。
Linux还在struct tm
中显示以下字段:
t1.gmtoff = 10800;
t1.tm_zone = "MSK";
答案 0 :(得分:2)
直到2011年,在冬季,即10月的最后一个星期日和3月的最后一个星期日之间,莫斯科标准时间(MSK,МСК)比UTC早3小时,或UTC + 3;在夏季,莫斯科时间在莫斯科标准时间前一小时向前转移到莫斯科夏令时(MSD),使其成为UTC + 4。
2011年,俄罗斯政府宣布全年将全天观察夏令时,从而有效取代标准时间 - 政府宣称这一行动源于健康问题,归因于每年之间来回转换标准时间和夏令时。 2011年3月27日,莫斯科人最后一次将他们的时钟向前推进,有效地永久观察MSD或UTC + 4。
自莫斯科观察2007-11-14冬季时间(UTC + 3),11:19:07 MSK时间为08:19:07 UTC,Unix时间戳为1195028347。
看起来你在Linux上获得的价值是正确的,你在Windows上获得的价值似乎假定UTC + 4不正确。