Delphi獲取與設置系統時間格式,即GetLocaleInfo和SetLocaleInfo


在Delphi中,特別是在寫管理系統軟件時,經常要用到 FormatDateTime 以將 TDateTime 格式的日期時間轉換成字符串形式的值顯示或保存起來,或者用 StrToDateTime將字符串形式的日期時間轉換成 TDateTime 然后再做其他操作。

在進行時間或日期的轉換時,會使用系統當前設定的時間日期格式。而如果時間日期格式與字符串中的表示方式不相符,會使轉換過程失敗。例如當前短日期格式設定為'yyyy/MM/dd',而要轉為 '2006-10-20'這樣的字符串為日期,就會報錯,說這不是一個有效的日期。
所以在進行轉換前,要確保系統的日期時間格式與程序中使用的相符。一種方法是在安裝時由安裝程序設置,或者明確告訴用戶必須設置成要求格式。另一種就是程序在啟動時,自動設定為需要的格式,退出程序時再恢復原來的設置。


需要用到的有兩個Windows API,一個是 GetLocaleInfo,一個是 SetLocaleInfo。

查API說明:
int GetLocaleInfo(
LCID Locale, // locale identifier ,設置信息的范圍,是系統級,還是當前用戶
LCTYPE LCType, // type of information,設置信息的類型
LPTSTR lpLCData, // address of buffer for information,設置成的值,必須用 pchar的格式傳進去
int cchData // size of buffer
);
BOOL SetLocaleInfo(
LCID Locale, // locale identifier,同上
LCTYPE LCType, // type of information to set
LPCTSTR lpLCData // pointer to information to set
);
兩個函數的參數很類似,其中 Locale可以取兩個值:LOCALE_SYSTEM_DEFAULT,表示要操作的是系統默認的設置; LOCALE_USER_DEFAULT,表示要操作的是當前用戶的設置。還可以取其他值,用於具體修改某種語言區域的設置。一般取 LOCALE_USER_DEFAULT。
LCType,表示要操作信息的類型,也就是要操作的是哪一種設置。可用的值有很多,Delphi的聯機幫助,或者查MSDN,都有一個大列表。但跟日期時間格式相關的一共有這幾個:
LOCALE_SSHORTDATE :短日期格式
LOCALE_SLONGDATE :長日期格式
LOCALE_STIMEFORMAT:時間格式
另外 LOCALE_STIME 表示時間分隔符,LOCALE_SDATE 表示日期分隔符。可以單獨使用,也可以在使用 LOCALE_SSHORTDATE 和 LOCALE_STIMEFORMAT 的同時一並修改,所以不需要單獨操作。
使用GetLocaleInfo或SetLocaleInfo時,每次只能操作一個類型。比如要同時設置短日期格式、長日期格式、時間格式,就必須分別用三個類型代號調用三次 SetLocaleInfo。
還要一個要注意的問題是,設置日期時間格式后,應該向當前系統的激活窗口廣播發送 WM_SETTINGCHANGE 消息,否則即使修改了,程序里還是不能用的。
以下是獲取和設置的程序片斷。

1.//獲取時間日期格式
procedure GetDateTimeFormat();
var
buf:pchar;
i:integer;
GPrevShortDate,GPrevLongDate,GPrevTimeFormat:string;
begin
getmem(buf,100);
i:=100; //i必須在調用前賦值為buf緩沖區的長度。如果設為0或負值,將取不到設置的值
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,buf,i); //取當前用戶設置,短日期格式。
GPrevShortDate:=string(buf);
i:=100;
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SLONGDATE,buf,i); //取長日期格式
GPrevLongDate:=string(buf);
i:=100;
GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_STIMEFORMAT,buf,i); //取時間格式
GPrevTimeFormat:=string(buf);
FreeMem(buf);
end;

2.//設置時間格式
procedure SetDateTimeFormat();
var
p:DWORD;
begin
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,pchar('yyyy-MM-dd')); //短日期
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SLONGDATE,pchar('yyyy''年''M''月 ''d''日'''));
SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_STIMEFORMAT,pchar('H:mm:ss')); //設置時間
SendMessageTimeOut(HWND_BROADCAST,WM_SETTINGCHANGE,0,0,SMTO_ABORTIFHUNG,10,p);
//設置完成后必須調用,通知其他程序格式已經更改,否則即使是程序自身也不能使用新設置的格式
end;
在程序初始化時調用GetDateTimeFormat,將取出的設置保存起來,然后用SetDateTimeFormat設置需要的格式。在程序退出時再次調用SetDateTimeFormat將保存的值寫回去。
當然,如果程序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM