2012-06-15 20 views
2

這兩個函數有什麼區別?這是我的理解,那些應該是相同的:http://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.htmlmktime和timelocal的區別

我寫了這個代碼來測試轉換(Qt的部分僅用於比較):

#include <QCoreApplication> 
#include <QDateTime> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QDateTime datetime(QDate(2012, 3, 25), QTime(5, 15)); 
    qDebug("Timestamp: %lld.", datetime.toMSecsSinceEpoch()/1000L); 

    time_t timestamp; 
    tm* timeinfo = localtime(&timestamp); 
    timeinfo->tm_hour = 5; 
    timeinfo->tm_mday = 25; 
    timeinfo->tm_min = 15; 
    timeinfo->tm_mon = 2; 
    timeinfo->tm_year = 112; 
    timeinfo->tm_sec = 0; 
    qDebug("Timestamp: %ld.", timelocal(timeinfo)); 

    return 0; 
} 

,發現輸出是:

Timestamp: 1332645300. 
Timestamp: 1332645300. 

這是我想期望。然後我換成timelocalmktime,並發現這是輸出:

Timestamp: 1332645300. 
Timestamp: 1332648900. 

好像是增加了一小時(考慮到我目前的時區爲GMT + 2:00,我的區域設置爲意大利)。爲什麼?兩者之間的區別是什麼,爲什麼mktime增加了1個小時到我設置的日期?

編輯:我再次測試,它似乎在Mac OS X(和iOS)timelocal將返回放在timeinfo結構的同一時間,而mktime實際上都在返回time_t值和增加一小時結構tm

在Linux上,Kubuntu代替了這兩個函數,我得到的結果是tm結構和返回值都加了一個小時。

任何人都可以解釋爲什麼?

+0

我用C++編譯器編譯。 –

+0

但是你把它標記爲C,所以要一致。現在,我[運行你的代碼](http://ideone.com/M7Ik7),看起來結果是一樣的... –

+0

我在我的問題中增加了一些細節。你在哪個平臺上運行? –

回答

5

OpenBSD的timelocal狀態的人:

timelocal是一個過時的接口,相當於調用 mktime()爲負值爲tm_isdst

tm_isdst負值意味着timelocal沒有按考慮夏令時(DST)。看來QDateTime也有DST的麻煩。
,另一方面mktime,處理DST,這或許可以解釋在OS X

了1個小時的時差由於timelocal已過時,它可能與DST正確處理新imlementations。