2

这是功能

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(Ubuntu 12.04、gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3)中返回 1195028347,在 Windows 中返回 1195024747(windows 7、Visual Studio 2010)。

可以看出,时差是3600。

我在同一台计算机上运行两个操作系统(双启动),它位于 MSK 时区。两个操作系统都与互联网时间同步,并且它们的系统时钟显示正确的时间。

当我使用另一个参数“2012:08:21 18:20:40”调用此函数时,我在两个系统中都得到 1345558840。

为什么在几种情况下结果不同?

编辑 忘了提。我在调用后控制 t1 变量的内容mktime()

在这两个系统中:

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

1 回答 1

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

于 2013-09-24T15:23:07.077 回答