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;

需要设置一全局变量保存启动时获取的日期格式.并在结束时恢复此格式.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值