DELPHI中關於系統日期格式及程序處理

delphi調用strtodatetime時遇到日期格式錯誤,但是檢查了字符串後發現爲'2000-01-01'並沒有問題。

 

同事提示我去看一下控制面板裏的 區域和語言選項 裏, 發現果然短日期分隔符爲 / ,則日期解析的格式變成 2000/01/01,顯然之前的字符串會出現問題.

 

於是查找資料,發現有關於此問題的windows 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,表示要操作信息的類型,也就是要操作的是哪一種設置。可用的值有很多:
LOCALE_SSHORTDATE :短日期格式
LOCALE_SLONGDATE :長日期格式
LOCALE_STIMEFORMAT:時間格式
另外 LOCALE_STIME 表示時間分隔符,LOCALE_SDATE 表示日期分隔符。可以單獨使用,也可以在使用 LOCALE_SSHORTDATE 和 LOCALE_STIMEFORMAT 的同時一併修改,所以不需要單獨操作。
使用GetLocaleInfo或SetLocaleInfo時,每次只能操作一個類型。比如要同時設置短日期格式、長日期格式、時間格式,就必須分別用三個類型代號調用三次 SetLocaleInfo。

在程序啓動時執行此函數:

function GetDateTimeFormat():string;
var
  buf:pchar;
  i:integer;
  GPrevShortDate,GPrevLongDate,GPrevTimeFormat:string;
begin
  getmem(buf,20);
  i:=20; //i必須在調用前賦值爲buf緩衝區的長度。如果設爲0或負值,將取不到設置的值
  GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,buf,i); //取當前用戶設置,短日期格式。
  GPrevShortDate:=string(buf);
  FreeMem(buf);
  result := GPrevShortDate;
end;

 

程序結束時執行此函數:

procedure SetDateTimeFormat(aParam:string);
var
  p:DWORD;
begin
  SetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_SSHORTDATE,pchar(aParam)); //設置短日期格式
  SendMessageTimeOut(HWND_BROADCAST,WM_SETTINGCHANGE,0,0,SMTO_ABORTIFHUNG,10,p);//設置完成後必須調用,通知其他程序格式已經更改,否則即使是程序自身也不能使用新設置的格式
end;

 

需要設置一全局變量保存啓動時獲取的日期格式.並在結束時恢復此格式.

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