2012-03-16 64 views
2

我的時區在控制面板日期/時間小程序中設置爲CDT爲什麼_localtime32和_gmtime32爲非GMT時區返回相同的時間值?

下面的代碼的地方一模一樣的日期和時間爲pCurGmtTimepCurTime

int main(int argc, char *argv[]) 
{ 
    __time32_t t=_time32(NULL); 

    tm *pCurGmtTime=_gmtime32(&t); 
    tm *pCurTime=_localtime32(&t); 

    // The values in the *pCurGmtTime structure are equal to the values in *pCurTime 

    return 0; 
} 

我沒有TZ環境變量設置,但我的時區是通過控制正確的配置系統面板日期和時間小程序。這種行爲似乎違背了這些功能的MSDN文檔,其中說TZ覆蓋控制面板設置,但如果它不存在,將使用控制面板設置。

由於

回答

3

由於

兩個gmtime的,mktime,mkgmtime,和localtime所有的32位和64位的版本使用每個線程的單個TM結構的轉換。

第二次調用將數據寫入與前一次相同的位置。在撥打localtime之前,您需要將數據複製到其他地方。

5

由於通過這兩個呼叫指向相同的內部結構返回的指針:

http://msdn.microsoft.com/en-us/library/bf12f0hc(v=vs.80).aspx

兩個gmtime的,mktime,mkgmtime的32位和64位版本,和本地時間都轉換使用每個線程的單個tm結構。每次調用其中一個例程都會破壞前一個調用的結果。

你的第二個電話(_localtime32())會覆蓋第一個呼叫的值。如果你要比較指針值本身,你會發現它們是一樣的。

如果您使用文檔頂部指出的_s版本,那麼您將不會遇到該問題,因爲您必須通過自己的​​。

+0

hamstergene首先回答,所以他會得到複選標記,但我給了你+1,因爲你提供了關於如何通過_s函數首先避免問題的更多細節。 – 2012-03-16 14:17:32

+0

這是你的選擇。我可能會提到花費額外的45秒來提供更完整的答案......然後真正快速地修改它來修正錯字。 – 2012-03-16 14:21:29

+0

這太糟糕了,無法授予多個複選標記,但我可以看到這將導致濫用行爲......如果有任何安慰,我還有另一個相關問題,我將要問,因此您可以觀察它。 – 2012-03-16 14:27:14

相關問題