2010-11-01 152 views
1

最近我一直有问题,最近有日期转换。我的应用程序运行的某些工作站不能正确地将字符串转换为日期。VarToDateTime(VarDateFromStr)使用哪种日期格式?

我将问题追溯到VarDateFromStr,该问题似乎未检查LOCALE_SSHORTDATE以进行转换。我想知道是否有人知道它检查转换的内容。或者,不同的行为仅与不同的DLL版本相关联?

GetLocaleStr(GetThreadLocale, LOCALE_SSHORTDATE, 'm/d/yy'); // returns 'dd-MM-yyyy' 
FormatDateTime('dd-MM-yyyy', VarToDateTime('05-11-2010')); //returns '11-05-2010' 

编辑: 我已经告诉改变从 'DD-MM-YYYY' 短日期格式(控制面板),以任何和回 'DD-MM-YYYY' 固定问题。我仍然需要验证这一点。编辑2:Kindda忘了提,这个问题只在WinXP SP3上得到确认。

回答

3

Ken,VarToDateTime函数在内部调用VarDateFromStr函数,它使用常量VAR_LOCALE_USER_DEFAULT来格式化日期。

确定至极格式包含VAR_LOCALE_USER_DEFAULT您可以使用此代码

var 
FormatSettings  : TFormatSettings; 
begin 
     GetLocaleFormatSettings(VAR_LOCALE_USER_DEFAULT, formatSettings); 
     ShowMessage('VarToDateTime is using this format to convert dates '+formatSettings.ShortDateFormat); 
end; 

现在避免你的问题,您可以将您的变量值转换为字符串,然后以日期时间使用StrToDateTime功能

var 
v     : variant; 
FormatSettings  : TFormatSettings; 
Begin 
     v:='05-11-2010';//this is your variant. 
     FormatSettings.ShortDateFormat:='dd-mm-yyyy';//use this format in the conversion 
     ShowMessage(FormatDateTime('dd-MM-yyyy', StrToDateTime(V,FormatSettings))); 
end; 
+1

自从我摔倒之后,我只会补充一点。请务必设置日期分隔符。否则,你会在荷兰和其他各个国家堕落。 – mj2008 2010-11-01 15:57:30

+0

mj2008,好点。 – RRUZ 2010-11-01 16:02:58

+0

那么,VAR_LOCALE_USER_DEFAULT的ShortDateFormat也是'dd-MM-yyyy'。并且这些问题不仅来自我的代码,而且来自DevExpress,TClientDataset,InfoPower ... – 2010-11-01 16:48:40