Иногда разные результаты mktime в windows и в linux

Вот функция

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», он возвращает 1195028347 в Linux (Ubuntu 12.04, gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3) и 1195024747 в Windows (Windows 7, Visual Studio 2010).

Как видно, разница во времени составляет 3600.

Я запускаю обе операционные системы на одном компьютере (с двойной загрузкой), который находится в часовом поясе MSK. Обе ОС синхронизированы с интернет-временем, и их системные часы показывают правильное время.

Когда я вызываю эту функцию с другим аргументом «2012:08:21 18:20:40», я получаю 1345558840 в обеих системах.

Почему результаты различаются в нескольких случаях?

EDIT Забыл упомянуть. Я контролирую содержимое переменной 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";

person wl2776    schedule 24.09.2013    source источник
comment
разница может быть Sommerzeit (извините, не знаю на английском)   -  person donald123    schedule 24.09.2013
comment
@ donald123 Если бы это было причиной, разница была бы в один час, а не в одну минуту.   -  person Carey Gregory    schedule 24.09.2013
comment
Разница ровно в одну минуту. Как вы можете быть уверены, что Linux и Windows имеют одинаковое время, если загрузка с одной на другую занимает минуту или больше?   -  person Carey Gregory    schedule 24.09.2013
comment
@ Кэри Грегори, извините, вы правы, это одна минута .. но на ваш ответ ... он вызывает функцию static с 2007:11:14 11:19:07 в обеих системах ..   -  person donald123    schedule 24.09.2013
comment
@ donald123 О, да, хорошая мысль. Очень странные результаты.   -  person Carey Gregory    schedule 24.09.2013
comment
@CareyGregory: timediff составляет один час, а не одну минуту. Я смутно припоминаю, что было несколько изменений в наших законах, регулирующих часовые пояса. Москва была GMT+3, затем в итоге стала GMT+4.   -  person wl2776    schedule 24.09.2013
comment
@ wl2776 Так оно и есть. Я должен выпить кофе, прежде чем комментировать SO. ;-)   -  person Carey Gregory    schedule 24.09.2013


Ответы (1)


Из Википедия: Московское время

До 2011 года зимой, между последним воскресеньем октября и последним воскресеньем марта, стандартное московское время (MSK, МСК) опережало UTC на 3 часа, или UTC+3; летом московское время сдвинулось на дополнительный час вперед по сравнению со стандартным московским временем и стало московским летним временем (MSD), что сделало его UTC + 4.

В 2011 году российское правительство провозгласило, что в будущем переход на летнее время будет осуществляться круглый год, тем самым фактически заменив стандартное время. летнее время. 27 марта 2011 года москвичи в последний раз перевели часы вперед, фактически постоянно соблюдая MSD или UTC + 4.

Поскольку в Москве 14 ноября 2007 г. было зимнее время (UTC+3), 11:19:07 MSK было 08:19:07 UTC, а временная метка Unix была 1195028347.

Похоже, что значение, которое вы получаете в Linux, правильное, а значение, которое вы получаете в Windows, похоже, предполагает UTC+4, что неверно.

person Joni    schedule 24.09.2013