Вот функцияИногда разные результаты в окнах указываете ей и в 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";
diff может быть Sommerzeit (извините, не знаю его по-английски) – donald123
@ donald123 Если бы это было причиной, разница была бы на один час, а не на одну минуту. –
Разница ровно одна минута. Как вы можете быть уверены, что Linux и Windows имеют ровно одно и то же время, так как для загрузки с одного на другой требуется минута или больше? –