在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();
varbuf: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();
varp: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將儲存的值寫回去。
時間格式的設定
在進行formview顯示時間資料的時候,發現格式仍然是日期和時間的完整格式,如是進行了dataformatstring 的設定.如下所示 asp boundfield headertext displaytext datafield fieldname dataformatstring items...
quartz 設定時間格式
乙個cron表示式有至少6個 也可能7個 有空格分隔的時間元素。按順序依次為 1.秒 0 59 2.分鐘 0 59 3.小時 0 23 4.天 月 0 31,但是你需要考慮你月的天數 5.月 0 11 6.天 星期 1 7 1 sun 或 sun,mon,tue,wed,thu,fri,sat 7....
設定時間格式的JSpinner
上圖 封裝成函式 public class getspinner catch parseexception e1 spinner.setmodel datemodel 對spinner的時間格式進行設定 spinner.seteditor new jspinner.dateeditor spinne...