2009-12-23 134 views
1

我有一個多線程應用程序需要向用戶顯示某些日期。日期使用UTC Unix時間值進行存儲。但是,日期必須顯示在用戶的時區中,而不是本地服務器時間或UTC。基本上,我需要這樣的功能:C/C++中線程安全的時區特定時間顯示

struct tm *usertime_r(const time_t *timer, struct tm *result, const int timezone) { 
    <just like localtime_r, except it uses UTC+timezone as the timezone> 
} 

此功能必須是線程安全的,所以我不認爲設置TZ環境變量將是一種選擇。

回答

3

如果您知道用戶從UTC以秒爲單位的偏移量,則只需從time_t中添加/減去該值,並將結果傳遞給gmtime_r即可。

例如,澳大利亞東部夏令時間爲+11,這意味着您會將(11*3600)添加到時間值。

+2

這是一個非常非常基本的答案,因爲系統庫不能準確跟蹤許多更改,所以對於許多時區實際上並不可行。只是抵消是不夠的,因爲它隨時間而變化。 – 2013-12-31 17:03:18

1

作爲caf答案的推論,<tzinfo.h>標題可用於獲取給定時區的UTC偏移量。公共領域時區數據庫包含大量信息;在我用過的Linux發行版上,它可以在/usr/share/zoneinfo中瀏覽,我相信蘋果將它與iTunes for Win32一起打包。

從上大多數發行版在命令行中,你可以這樣做:

# it's easy to find out what timezones are available 
$ file /usr/share/zoneinfo/{US/Eastern,UTC} 
/usr/share/zoneinfo/US/Eastern: timezone data 
/usr/share/zoneinfo/UTC:  timezone data 

# now examine them 
$ zdump US/Eastern UTC 
US/Eastern Wed Dec 23 00:11:31 2009 EST 
GMT   Wed Dec 23 05:11:31 2009 UTC 

就像我們/東方目前在標準時間(它會在暑假期間打印EDT),而且它的五小時UTC,它可以爲您提供與UTC的偏移量。

+0

你有鏈接?我可以在Google上找到的是Python和Ruby庫。這感覺有點像「漫長的路要走」,必須運行一個外部程序才能找回一個字符串,然後我必須解析,所有這些都只是爲了找出紐約距離UTC有多遠。 :-( – 2014-09-02 11:47:26