2013-09-24 1 views
1

Вот функцияИногда разные результаты в окнах указываете ей и в 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"; 
+0

diff может быть Sommerzeit (извините, не знаю его по-английски) – donald123

+0

@ donald123 Если бы это было причиной, разница была бы на один час, а не на одну минуту. –

+0

Разница ровно одна минута. Как вы можете быть уверены, что Linux и Windows имеют ровно одно и то же время, так как для загрузки с одного на другой требуется минута или больше? –

ответ

2

От Wikipedia: Moscow Time

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

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

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

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