//=====================================================================
//TITLE:
// UTC轉換本地時間
//AUTHOR:
// norains
//DATE:
// Friday 26- March-2010
//Environment:
// WINDOWS XP
// WINDOWS CE
//=====================================================================
一般情況下,我們很少需要用到UTC轉換為本地時間--因為如果僅僅是獲取本機的本地時間,我們完全可以不用如此麻煩,直接調用GetLocalTime即可。
即使萬一真的需要用到UTC轉換到特定時區的本地時間,只要你是在WinXP的環境下,也並不會花費太大的勁,只要調用SystemTimeToTzSpecificLocalTime函數:
就這么簡單,調用一個函數即可進行轉換。可能大家唯一疑惑的是DEFAULT_TIME_ZONE_INFORMATION的取值是怎么來的,其實很簡單,TIME_ZONE_INFORMATION的時差是以分鍾為單位的,北京時差為8個小時,所以8*60=480。如果是別的時區,可以依此進行更改。
WinXP是簡單了,但對於WinCE卻是麻煩了。相對於WinXP來說,需要用到時區轉換的機會更多,因為很多系統定制時,習慣於定義系統的默認語言為英文,以此加快加載速度和減小系統容量,所以在顯示時間時必須要進行一次UTC的時間轉換。可這更常使用的場合,卻偏偏沒有SystemTimeToTzSpecificLocalTime函數!
沒轍,活人總不能被尿給憋死吧?微軟不為我們准備,那我們就自己豐衣足食咯!
我們先從原理上想想這時區的轉換,其實無非就是UTC時間偏移多少個小時,也就一個簡簡單單的加加減減。但問題在於,SYSTEMTIME是一個結構體,成員有秒、分、時等等。如果只是時間上的加減倒還是簡單,畢竟都是60進制的;但涉及到日期,卻不是一般的麻煩了。比如是今天是1號,那前一天是幾號?這個不僅涉及到大小月,還有閏月的問題。不僅如此,還需要判斷當前是星期幾,這也不是一件輕松的事情。所以,直接采用SYSTEMTIME進行計算,對於我們來說是不太現實。
那我們換個角度來想,SYSTEMTIME不方便,那么我們轉換為FILETIME來計算不就可以了么?FILETIME可是以100個億分之一秒為單位的啊,這不就可以直接加減了么?話雖如此,但還是有個問題。我們來看看FILETIME的聲明:
問題就來了,FILETIME是一個結構體,包含了兩個成員,我們無法直接進行算術運算!
別急,問題還不是很嚴重。仔細觀察一下,FILETIME是由兩個DWORD組成,每個DWORD是32bit,一共64bit。那么,我們直接用一個64bit的變量存儲該數值,不就可以簡單地進行運算了?
所以,我們WinCE下自力更生的SystemTimeToTzSpecificLocalTime函數出爐了:
因為該函數的接口和WinXP的一模一樣,所以文章開頭的代碼,我們可以不用做任何更改就能正確地在WinCE中運行了!