2012-06-20 30 views
2

我在我的C++程序中使用clock_gettime()來獲取當前時間。但是,返回值是UTC以來的秒數。如果時間偏移一個小時,此代碼在夏令時期間可能會在我的時區中混亂。C++ clock_gettime()和夏時制

該系統本身具有NTP同步它始終給予正確的時間在EST。有沒有辦法讓clock_gettime()報告本地時間而不是UTC,這樣我可以避免夏令時問題?

+2

爲什麼不從UTC轉換到當地時間?將「轉換時間」從「轉換到當地時間」分開。 –

+0

當然,但我必須在我的代碼中每年手動更換兩次轉換因子。 – user788171

+1

我並不是建議對它進行硬編碼。我建議使用時區感知的日期/時間庫來執行轉換。 –

回答

1

認識到time也報告自1970年初以來的秒數(在time_t)。如果你將tv_sec成員timespec並將其傳遞給localtimelocaltime_r,那麼應該得到你想要的。

timespec tsv; 
clock_gettime(CLOCK_REALTIME, &tsv); 
time_t t = tsv.tv_sec; // just in case types aren't the same 
tm tmv; 
localtime_r(&t, &tmv); // populate tmv with local time info 

而且可以應對,但是你希望timespectv_nsec成員。

+0

這段代碼似乎並沒有爲我編譯,我碰到這個:error:can not convert?timespec *? to?const time_t *?爭論?1? to?tm * localtime_r(const time_t *,tm *)? – user788171

+0

@ user788171:代碼爲我逐字編譯。我從編譯的代碼中粘貼它。 – jxh

0

如果您使用Windows,您可以使用此GetTimeZoneInformation,但您必須包含Windows API。

實現此目的的另一種方法是結構tm。你會在這裏找到細節:struct tm。 「如果夏令時生效,則夏令時標誌(tm_isdst)大於零,如果夏時制不生效,則夏令時標誌爲零;如果信息不可用,則夏令時標誌小於零。我認爲這是更簡單的方法。