2011-06-06 66 views
3

我寫一個應用程序轉換UTC時間以不同的時區線程安全的方式,現在我可以使用這樣的轉換時區之間的時間

putenv("TZ=TIMEZONE1"); 
tzset() 
... 
do time conversions 

,但我不認爲它是線程安全的,所以是否有任何C/C++庫可以通過以時區作爲參數來實現時區轉換,而不是一些全局功能

回答

2

Boost.DateTime支持時區轉換。

+0

我從來沒有使用過提升,所以我可以只包括提升日期時間? – 2011-06-06 20:56:43

+0

確定那很簡單'sudo apt-get install libboost-date-time1.40-dev'我準備好了! – 2011-06-06 22:03:59

+0

出於好奇,Boost是否有自己的時區數據庫或以某種方式使用系統? – 2011-06-06 22:27:47

3

您可能需要您自己的代碼/庫來處理時區。標準庫的處理非常落後,不適合處理比在程序生命週期中固定的單個時區更復雜的任何事情。

但是,一種可能的解決方案是分配共享內存fork,並在子進程中更改時區,然後將結果傳遞迴共享內存以在waitpid在父級中返回後讀取。這是非常昂貴的,但並不像聽起來那麼糟糕,因爲現代系統上的fork速度很快。我的經驗是,1 fork等於2-3個撥打pthread_create,1 pthread_create等於2-3個open調用。由於更改時區需要打開一個或多個文件並在其上執行IO,因此您可能不會將總時間成本增加超過3-5倍。如果您可以隨時爲您工作的每個時區保留一個子進程,那麼當然可以更高效。

+0

+1確認,我希望有必要是在libc等東西,所以看起來像一個過程,將數據分爲時區,然後爲每個時區單獨進程是要走的路:( – 2011-06-06 20:53:37