1、使用API函數SetLocalTime進行本地時間設置。
1)SetLocalTime函數的原型:
BOOL SetLocalTime( const SYSTEMTIME *lpSystemTime );
輸入參數lpSystemTime是一個SYSTEMTIME類型的參數,如果設置成功,返回true,本地時間將會變成lpSystemTime所指定的時間,否則返回false。
看一下SYSTEMTIME的格式:
typedef struct _SYSTEMTIME {
WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME, *PSYSTEMTIME; 各成員的含義不用解釋了吧。 2)我們來看一下如何利用SYSTEMTIME結構體和SetLocalTime函數進行本地時間的設置。
SYSTEMTIME st; st.wMilliseconds = 0; SetSystemTime(&st); 對比一下SYSTEMTIME結構體,可以發現,除wDayOfWeek成員之外,其它各成員都進行賦值了,甚至連wMilliseconds。使用這種 方式進行系統時間設置時,會忽略wDayOfWeek成員,可以不進行該成員的賦值(即使你賦值了也不會被考慮的),但其它所有成員都必須時行賦值,否則 無法成功地進行時間設置。
3)如果只想對其中的幾項進行設置的話,可以先使用GetLocalTime函數來獲取當前本地時間,然後再對相應的項進行修改,如下: SYSTEMTIME st; 這樣的方式比上面方便多了。
4)上面說到的方法都是對每一項單獨進行設置,在VC裏面,也提供了一次性設置所有項的方法,使用COleDateTime類。 COleDateTime tm; tm.GetAsSystemTime(st); 程序應該很好懂吧,不過有幾個注意點要說明一下。 a)先是ParseDateTime,函數原型: BOOL ParseDateTime( "25 January 1996"
b)dwFlags有三種值,LOCALE_NOUSEROVERRIDE、VAR_TIMEVALUEONLY、VAR_DATEVALUEONLY。 LOCALE_NOUSEROVERRIDE是使用系統默認的方式,VAR_TIMEVALUEONLY是忽略日期,在該選項下,日期會被設置爲0,也就 是1899年12月30日,在VAR_DATEVALUEONLY下忽略時間,時間被設置爲0,即午夜零點。
c)至於第三個參數lcid,是指定轉換方式,語言支持方面的,MSDN裏面有個很詳細的表,有興趣可以去看看。
d)COleDateTime還提供了獲取時間的函數,如GetYear()之類的。
e)注意一下,如果沒有指定日期的話,轉換後日期就自動變爲0,也就是跑1899年去了,這可很危險啊。本來還想偷個懶不指定呢,誰知道怎麼偷懶的告訴我一聲啊。
2、SetLocalTime與SetSystemTime的差別 SetSystemTime的用法與SetLocalTime基本相同,不重複了。差點在於SetSystemTime所帶的參數指定的是UTC時間(國 際標準時間),也就是說,像我的電腦裏指定的是東八區,這樣的話,使用SetSystemTime設置之後,系統的時間,會比參數裏所設置的時間快8個小 時。 另外,這兩個函數設置的時間,都是對本地機各個系統都有效的。本來很好奇windows系統下改了時間,linux下是不是也會跟着改呢。事實證明是這樣的。
3、使用COleDateTimeSpan類進行時間的加減。 COleDateTime tm; ts.SetDateTimeSpan(0,8,0,-14);
這個程序也很易懂,不說什麼了,你只要想清楚了是該加上這個時間差呢還是減去這個時間差就行了,我是經常轉不過來啦。
另外,似乎在XP下有權限問題,不是管理員賬號的可能不能這樣進行修改,這個我沒有去試過,誰去試過了跟我說一下吧。
最後補充一句,修改系統時間之後,編譯時候容易出問題,最好是每次編譯的時候把時間改回來了再重新編譯,或者使用rebuild all,全部重新編譯,要不很有可能即使你編譯了,而得到的可執行文件還是修改之前的。 |
VC 設置系統時間
VC 設置系統時間
2009年06月08日 星期一 18:18
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.