C stat () и летнее время - PullRequest
       22

C stat () и летнее время

3 голосов
/ 16 июля 2010

У меня серьезные проблемы с функцией stat ().У меня есть приложение, скомпилированное под cygwin ond Windows 7, и то же приложение, скомпилированное с MSVC ++ для Windows 7. Приложение содержит следующий код:

struct stat stb;
memset( &stb, 0, sizeof( stb ) );

stat( szPath, &stb );

cout << hex << uppercase << setw(8) << stb.st_mtime << endl;

szPath - это путь к файлу.Файл никак не изменяется приложением.Проблема в том, что я получаю разные результаты для некоторых файлов.Например:

cygwin version: 40216D72
MSVC++ version: 40217B82

Разница всегда E10 = 3600 = 1 час

Используя Google, я нашел это , что кажетсябыть точно такой же проблемой, которую я вижу.Есть ли портативный способ как это исправить?Я не могу использовать любые вызовы WinAPI.Самое простое и надежное решение - это то, что я ищу, но если оно должно быть сложным, пусть будет так.Надежность и мобильность (win + linux) - это самое важное.

Ответы [ 3 ]

2 голосов
/ 18 июля 2010

Чтобы получить здесь и надежность, и переносимость (или в большинстве ситуаций такого рода, когда две платформы делают разные вещи с тем, что должно быть "одним и тем же" кодом), вам, вероятно, потребуется использовать некоторую форму кода, зависимого от цели, например :

#ifdef _MSC_VER
   // do MSVC++-specific code
#else
   // do Linux/Cygwin/generic code
#endif

После этого вы сможете использовать вызовы WinAPI в разделе _MSC_VER, поскольку они будут скомпилированы только при использовании MSVC ++

1 голос
/ 16 июля 2010

Очевидно, что за http://support.microsoft.com/kb/190315 это на самом деле ОСОБЕННОСТЬ, хотя для меня это действительно кажется ошибкой.Они говорят, что вы можете обойти это, сняв флажок «Автоматически настраивать часы для изменения летнего времени» в диалоговом окне «Свойства даты / времени» для системных часов.

Если у вас есть дата файла, вы можете использоватьОтносительное состояние dst, чтобы определить, нужно ли вам самостоятельно вносить коррективы в течение одного часа только в MSVC, но это тоже хакерство.

0 голосов
/ 16 июля 2010

Не уверен насчет используемых вами функций, но я знаю, что Windows и Linux по-разному используют системные часы.Windows хранит местное время (включая летнее время) на системных часах.Linux (по крайней мере, традиционно) хранит GMT (или, если быть точным, UTC) на системных часах.Я не знаю, относится ли это к cygwin.

Если система linux использует аппаратное обеспечение совместно с окнами, ее необходимо настроить на использование системных часов, таких как windows, или сбивать каждый раз, когда windows настраивает DST.

...