utc時間 單位換算 UTC轉換本地時間

2021-10-13 04:46:51 字數 3034 閱讀 1666

//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...