2009-04-17 110 views
27

在C/C++中將本地時間和UTC之間的日期時間轉換爲最佳方式是什麼?在C/C++中在本地時間和GMT/UTC之間轉換

「日期時間」,我的意思是一些時間表示,包含日期和時間。我會很高興與time_t,struct tm,或任何其他表示,使它成爲可能。

我的平臺是Linux。

下面是我試圖解決的具體問題:我得到一對值包含朱利安日期和一天秒數。這些值以GMT格式。我需要將它轉換爲本地時區「YYYYMMDDHHMMSS」的值。我知道如何將Julian日期轉換爲Y-M-D,並且顯然很容易將秒轉換爲HHMMSS。然而,棘手的部分是時區轉換。我確信我可以找出解決方案,但我更喜歡找到一種「標準」或「衆所周知」的方式,而不是磕磕絆絆。


一個可能相關的問題是Get Daylight Saving Transition Dates For Time Zones in C

回答

21

你應該使用的gmtime/localtimetimegm/mktime組合。這應該給你正交工具做struct tmtime_t之間的轉換。

對於UTC/GMT:

time_t t; 
struct tm tm; 
struct tm * tmp; 
... 
t = timegm(&tm); 
... 
tmp = gmtime(t); 

對於本地時間:

t = mktime(&tm); 
... 
tmp = localtime(t); 

所有tzset()確實設置爲從TZ環境變量的內部時區變量。我不認爲這應該被稱爲不止一次。

如果您嘗試在時區之間進行轉換,則應修改struct tmtm_gmtoff

+0

謝謝!我知道像timegm()這樣的東西必須存在,但不知道名稱。 – 2009-04-17 19:22:18

+0

很高興幫助。時間轉換可能是一個相當棘手的領域。只要有可能,以UTC爲單位存儲所有內容通常是個好主意。時區之間的轉換更加棘手! – 2009-04-17 19:24:43

2

如果您需要擔心按時區規則轉換日期/時間,您可能需要查看ICU

17

如果在Windows上,你沒有timegm()爲您提供:

struct tm *tptr; 
time_t secs, local_secs, gmt_secs; 
time(&secs); // Current time in GMT 
// Remember that localtime/gmtime overwrite same location 
tptr = localtime(&secs); 
local_secs = mktime(tptr); 
tptr = gmtime(&secs); 
gmt_secs = mktime(tptr); 
long diff_secs = long(local_secs - gmt_secs); 

或類似的東西...

相關問題