2010-07-16 71 views
3

我對函數stat()有嚴重的麻煩。我在cygwin下編譯OND Windows 7和相同的應用程序與MSVC++編譯在Windows 7的應用程序包含下面的代碼的應用程序:C stat()和夏時制

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小時

通過使用谷歌,i found this,這似乎正好是我看到了同樣的問題。有沒有一種便攜式的方式來解決這個問題?我無法使用任何WinAPI調用。最簡單可靠的解決方案就是我所需要的,但如果它需要變得複雜,就這樣吧。可靠性和可移植性(win + linux)是最重要的。

+2

這就是爲什麼你應該永遠不會使用本地時間除了與用戶交互之外的任何內容。 – 2010-07-16 12:34:23

+0

不幸的是,這是我不能改變的。我的任務是確保兩個平臺上的輸出相同。 – PeterK 2010-07-16 13:12:20

回答

2

爲了在這裏獲得可靠性和可移植性(或者在大多數情況下,這種情況下兩個平臺與「相同」代碼做不同的事情),您可能需要使用某種形式的目標相關代碼,像:

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

那麼你應該能夠使用WinAPI的在_MSC_VER部分要求,因爲那樣只會當你使用編譯MSVC++

+0

會嘗試,儘管它不是我喜歡的解決方案。似乎認爲不會有任何其他選擇。 – PeterK 2010-07-18 08:39:12

1

顯然每http://support.microsoft.com/kb/190315這實際上是一個功能,雖然它真的看起來像一個bug。他們說你可以通過在系統時鐘的日期/時間屬性對話框中清除「自動調整夏令時更改時鐘」來解決這個問題。

如果您有文件的日期,您可以使用dst的相對狀態來確定您是否需要僅在MSVC中自行進行一小時的調整,但這也同樣困難。

0

不確定你正在使用的功能,但我知道Windows和Linux使用不同的系統時鐘。 Windows將本地時間(包括DST)存儲在系統時鐘上。 Linux(至少傳統上)在系統時鐘上存儲GMT(或準確的UTC)。如果這適用於cygwin,我不會。

如果一個linux系統與windows共享硬件,它需要配置爲使用系統時鐘(如Windows)或每次窗口調整DST時都會搞砸。