有时在Windows和Linux中有不同的mktime结果

时间:2013-09-24 13:59:51

标签: linux windows mktime

这是函数

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";

1 个答案:

答案 0 :(得分:2)

来自Wikipedia: Moscow Time

  

直到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不正确。