VC 設置系統時間

VC 設置系統時間
2009年06月08日 星期一 18:18
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.wYear = 2007;
st.wMonth = 11;
st.wDay = 24;
st.wHour = 3;
st.wMinute = 14;
st.wSecond = 0;

st.wMilliseconds = 0;

SetSystemTime(&st);

對比一下SYSTEMTIME結構體,可以發現,除wDayOfWeek成員之外,其它各成員都進行賦值了,甚至連wMilliseconds。使用這種 方式進行系統時間設置時,會忽略wDayOfWeek成員,可以不進行該成員的賦值(即使你賦值了也不會被考慮的),但其它所有成員都必須時行賦值,否則 無法成功地進行時間設置。

 

3)如果只想對其中的幾項進行設置的話,可以先使用GetLocalTime函數來獲取當前本地時間,然後再對相應的項進行修改,如下:

SYSTEMTIME st;
GetLocalTime(&st);
st.wHour = 3;
SetLocalTime(&st);

這樣的方式比上面方便多了。

 

4)上面說到的方法都是對每一項單獨進行設置,在VC裏面,也提供了一次性設置所有項的方法,使用COleDateTime類。

COleDateTime tm;
SYSTEMTIME st;

tm.ParseDateTime("2007-11-24 8:00:00");

tm.GetAsSystemTime(st);
SetLocalTime(&st);

程序應該很好懂吧,不過有幾個注意點要說明一下。

a)先是ParseDateTime,函數原型:

BOOL ParseDateTime(
LPCTSTR lpszDate,
DWORD dwFlags = 0,
LCID lcid = LANG_USER_DEFAULT );

lpszDate就是指定的日期時間了,可以有很多種形式,如:

"25 January 1996"
"8:30:00"
"20:30:00"
"January 25, 1996 8:30:00"
"8:30:00 Jan. 25, 1996"
"1/25/1996 8:30:00"

 

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;
COleDateTimeSpan ts;
tm.ParseDateTime("2007-11-24 8:00:00");

ts.SetDateTimeSpan(0,8,0,-14);
tm+=ts;
SYSTEMTIME st;
tm.GetAsSystemTime(st);
SetLocalTime(&st);

 

這個程序也很易懂,不說什麼了,你只要想清楚了是該加上這個時間差呢還是減去這個時間差就行了,我是經常轉不過來啦。

 

另外,似乎在XP下有權限問題,不是管理員賬號的可能不能這樣進行修改,這個我沒有去試過,誰去試過了跟我說一下吧。

 

最後補充一句,修改系統時間之後,編譯時候容易出問題,最好是每次編譯的時候把時間改回來了再重新編譯,或者使用rebuild all,全部重新編譯,要不很有可能即使你編譯了,而得到的可執行文件還是修改之前的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章