此篇文章打算介紹兩個,在平時工作中,使用頻繁并且十分有價值的功能。(因為你的項目不用到還好,只要用到,下面這兩個一般是必不可少)
功能點(diǎn)1:將本地時間轉(zhuǎn)成格林威治時間,或者是將格林威治時間轉(zhuǎn)成本地時間。
功能點(diǎn)2:將時間轉(zhuǎn)成時間戳,以及如何將時間戳轉(zhuǎn)成時間。
有些人可看剛看到上面的功能點(diǎn)概述,可能會覺得這沒什么難的。也的確,事實(shí)上,確實(shí)不難。但如果你要是沒真正處理過的話,可能一時還真會壁。比如:功能點(diǎn)1,將本地時間轉(zhuǎn)成格林威治時間。因為我們根本不知道我們當(dāng)前的本地時間與標(biāo)準(zhǔn)時間的時差到底是多少。所以你要怎么轉(zhuǎn)??(我們不能單純地認(rèn)為,我們是中國人,所以時差都是8個小時。那如果你的游戲要是發(fā)布到世界其他國家了??那時差就完全不同。甚至就算是中國,你在上海,跟在西藏,那時間也是有差別的。因此,我們需要根據(jù)本地時刻值,精確地計算出與標(biāo)準(zhǔn)時間的時差。從而才可以準(zhǔn)確轉(zhuǎn)換成格林威治時間。看下面處理方法:
a) 將格林威治時間轉(zhuǎn)成標(biāo)準(zhǔn)時間
ptime CommonHelper::utcToLocal(ptime utctime)
{
return boost::date_time::c_local_adjustor<ptime>::utc_to_local(utctime);
//說明:c_local_adjustor對象的utc_to_local()接口就是用來處理本地時間跟標(biāo)準(zhǔn)時間的偏差的。
//此處所謂的本地時間,并不是固定指說北京時間。而是你的計算處在地球的哪條經(jīng)線上,該經(jīng)線
//跟格林威治所處的經(jīng)線的時差量。(我剛看到這個功能時,實(shí)在太讓我驚訝了都!)
//但是有一點(diǎn)需要注意:boost中,只提供了標(biāo)準(zhǔn)時間轉(zhuǎn)本地時間的上述接口,卻沒有
//直接提供將本地時間轉(zhuǎn)成標(biāo)準(zhǔn)時間的接口。不過,既然有了utc_to_loca()這樣的神兵利器
//我們同樣可以很方便地處理將本地時間轉(zhuǎn)成標(biāo)準(zhǔn)時間的問題。見如何:
}
b) 將本地時間轉(zhuǎn)成格林威治時間
ptime CommonHelper::localToUtc(ptime ltime)
{
return ltime - (utcToLocal(epoch) - epoch);
//說明:(utcToLocal(epoch) - epoch)這部分內(nèi)容您的計算機(jī)的當(dāng)?shù)貢r差量(如果是在北京,那就是8小時)
}
接下來介紹一下第二部分的功能點(diǎn)。即:功能點(diǎn)2:將時間轉(zhuǎn)時間戳以及將時間戳轉(zhuǎn)時間
c) 將boost中的時間轉(zhuǎn)成時間戳,其實(shí)很簡單。中需要做如下處理即可。(在此就不多說)
WE::int64 CommonHelper::getUTCTimestamp()
{
return (microsec_clock::universal_time() - epoch).total_milliseconds();
}
d) 此處重點(diǎn)介紹一下,如何將時間戳轉(zhuǎn)成時間。這個確實(shí)有點(diǎn)令人頭痛。為什么這么說?因為時間戳,其實(shí)只是一個
數(shù)量值。這個數(shù)量值記載的信息的意義是指:自:1970-1-1到指定時刻所走過的時間量值。如此,或許有人就會說,
既然你都說了,是從1970到指定時刻的量值,兩個時間相加不就好了。確實(shí)是這樣子的,但有個小問題是:因為我們
沒法清楚這個量值的單位是什么。如果單位是:毫秒,而你把它當(dāng)成秒或當(dāng)成微秒來處理,結(jié)果都將是錯的。關(guān)于這點(diǎn),
其實(shí)boost有個時間處理的決策“的開關(guān)”,這個似乎還要看自己編譯的boost的lib是使用到哪個精度的級別。關(guān)于這塊
本人暫時還沒深入到這方面,所以也不敢妄言。不過,有個接口,大家可以參考著使用下。time_duration::resolution()
這個就可以用來識別,當(dāng)前系統(tǒng)中boost在時間這方面使用到的精度值。(例如本人目前項目中,使用到的是微秒級別的。
所以返回值為:micro。)
下面給他幾種實(shí)現(xiàn)時間戳轉(zhuǎn)時間的小例子:(以下假定,時間戳的單位為毫秒)
e) 通過接口:from_time_t();
ptime time_5 = from_time_t(timestamp);
f) 通過time_duration
milliseconds xx(time_1_stamp);
ptime xxxxxxxxxxxx = CommonHelper::epoch + xx;
g) 直接通過手動計算。此方法實(shí)現(xiàn)思路很簡單,但操作起來個人感覺易錯。寫的代碼量又多,所以本人還是建議使用上面兩種,特別是第2種
假如:timestamp是時間戳。則先計算出它的小時,再計算出它的分鐘,計算出它的秒數(shù),最后計算出它的毫秒數(shù)。然后與commonhelper::epoch相加即可。
注意:上面的e) f) g) 其實(shí)還是有區(qū)別的。用e)跟f)轉(zhuǎn)出來的精度值方面會不中方法g)。但在項目使用中,前兩者計算出來的精度值,一般
情況下,是絕對可夠的。這是一個注意點(diǎn),給大家提醒一下。
好了,這篇文章暫時就先寫到這吧。。其實(shí)關(guān)于boost時間,還有非常多的內(nèi)容可以挖掘,改天有機(jī)會再寫吧。希望對大伙有幫助。
如果有錯誤之處,還請指教。:)