//title:
// utc轉換本地時間
//author:
// norains
//date:
// friday 26- march-2010
//environment:
// windows xp
// windows ce
一般情況下,我們很少需要用到utc轉換為本地時間--因為如果僅僅是獲取本機的本地時間,我們完全可以不用如此麻煩,直接呼叫getlocaltime即可。
即使萬一真的需要用到utc轉換到特定時區的本地時間,只要你是在winxp的環境下,也並不會花費太大的勁,只要呼叫systemtimetotzspecificlocaltime函式:
systemtime systime = ;
//獲取系統時間。和getlocaltime不同,該函式返回的為utc時間
getsystemtime(&systime);
//中國時區的資訊
time_zone_information default_time_zone_information = ;
//將utc時間轉換為中國時區的本地時間
systemtimetotzspecificlocaltime(&default_time_zone_information,&systime,&systime);
就這麼簡單,呼叫乙個函式即可進行轉換。可能大家唯一疑惑的是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的宣告:typedef struct _filetime filetime;
問題就來了,filetime是乙個結構體,包含了兩個成員,我們無法直接進行算術運算!
別急,問題還不是很嚴重。仔細觀察一下,filetime是由兩個dword組成,每個dword是32bit,一共64bit。那麼,我們直接用乙個64bit的變數儲存該數值,不就可以簡單地進行運算了?
所以,我們wince下自力更生的systemtimetotzspecificlocaltime函式出爐了:boolsystemtimetotzspecificlocaltime(lptime_zone_information lptimezone,lpsystemtime lpuniversaltime,lpsystemtime lplocaltime)
if(lptimezone == null || lpuniversaltime == null || lplocaltime == null)
//如果指標為空,則沒有必要進行任何計算
return false;
//將utc時間由systemtime轉換為filetime格式
filetime ftuniversaltime = ;
systemtimetofiletime(lpuniversaltime,&ftuniversaltime);
//將filetime格式時間的數值儲存到乙個dword64變數中
dword64 ddwuniversaltime = ftuniversaltime.dwhighdatetime;
ddwuniversaltime = ddwuniversaltime << 32;
ddwuniversaltime += ftuniversaltime.dwlowdatetime;
//因為filetime的時間單位是100個億分之一秒,然後time_zone_information的時間單位是分,所以這裡需要乘以600000000
dword64 ddwbias = abs(lptimezone->bias);
ddwbias *= 600000000;
//轉換公式為:local_time = utc - bias
dword64 ddwlocaltime = 0;
if(lptimezone->bias > 0)
ddwlocaltime = ddwuniversaltime - ddwbias;
else if(lptimezone->bias < 0)
ddwlocaltime = ddwuniversaltime + ddwbias;
//將dword64數值轉換為filetime格式
filetime ftlocaltime = ;
ftlocaltime.dwlowdatetime = static_cast(ddwlocaltime);
ftlocaltime.dwhighdatetime = static_cast(ddwlocaltime >> 32);
//將filetime數值轉換為systemtime格式並返回
return filetimetosystemtime(&ftlocaltime,lplocaltime);
因為該函式的介面和winxp的一模一樣,所以文章開頭的**,我們可以不用做任何更改就能正確地在wince中執行了!
utc時間 單位換算 日期時間
使用time模組顯示當前日期和時間 開發乙個以多種格式顯示當前時間和日期的程式。轉換秒數為gmt時間。你要使用time模組中的asctime,它從計算機的內部時鐘讀取當前的日期和時間。在格林尼治時間內轉換秒數。你可以看到程式輸出的示例,如下所示。將天數 小時 分鐘轉換成秒 開發乙個程式,讀取使用者的...
utc時間 單位換算 OSAL之時鐘分析
osal的時鐘實現在osal cockble.c與osal clock.h兩個檔案中。osal支援完整的utc 世界統一時間 以2000年1月1日00 00 00為時間起點,可以精確到年 月 日 時 分 秒的時間值。1 定義utc格式的結構 typedef struct uint8 seconds ...
Python的UTC時間轉換
utc時間轉換,最終得到的都是utc時間。簡單來說就是 時間戳 timestamp 轉換 utc顯示時間 datetime 使用time.gmtime timestamp 顯示時間 datetime 轉換 utc時間戳 timestamp 使用calendar.timegm datetime.tim...