我正在尝试使用TryStrToDate验证用户输入的日期,以确保它们可以正确显示在我正在处理的应用程序的屏幕上,但不确切知道它是如何工作的。我希望能够在输入长度不是10个字符的有效日期时返回False。
例如,09/02/2012将返回True,但2012年2月9日或9/02/2012将返回False。
我想保持这个简单,所以我只对使用TryStrToDate感兴趣,但是如果有另一个内置函数可以做到这一点那么那就好了。用户输入的数据在输入时有效,仅允许10个字符的日期。
因此我正在使用类似的东西:
var
tempStr: string;
tempDate: TDateTime;
fs: TFormatSettings;
error: Boolean;
count: Integer;
begin
tempStr := '09/2/2012'; //example of a date that should be rejected.
GetLocaleFormatSettings(2048, fs);
error := not TryStrToDate(tempStr, tempDate, formatSettings);
if not error then
begin
error := True;
if Length(tempStr) = 10 then
begin
count := Length(tempStr) - Length(StringReplace(tempStr, '/', '', [frReplaceAll]));
error := not (count = 2);
end
end
end
哪种方法很好,但是还有一个数据实例是通过XML从.csv文件导入的,它可以有任何格式。
我目前的解决方案似乎仍然有效,但我想知道是否有办法通过使用TryStrToDate最小化处理并让它只接受我需要的10个字符格式的有效日期。 我试过手动设置短期格式:
fs.ShortDateFormat := 'mm/dd/yyyy';
但TryStrToDate始终接受有效日期,即使它们的长度不是10个字符。
我理想的解决方案是将其保持为:
error := not TryStrToDate(tempStr, tempDate, fs);
只是想知道是否可以使用TryStrToDate或其他一些delphi函数。
非常感谢任何帮助!
顺便说一句,我正在使用Delphi 7。
答案 0 :(得分:4)
创建此功能:
function IsValidDateCheck(const AValue: String): Boolean;
var
dtTemp: TDateTime;
begin
Result := False;
if Length(AValue) = 10 then
if (AValue[3] = '/') and (AValue[6] = '/') then
Result := TryStrToDate(AValue, dtTemp);
end;
使用示例:
if IsValidDateCheck(tempStr) then
ShowMessage(tempStr + ' is a valid date.')
else
ShowMessage(tempStr + ' is not a valid date.');
答案 1 :(得分:1)
关于你的第二个问题:
如果您不知道输入文件使用哪种日期格式,这将会给您带来很多痛苦。有许多日期格式,其中一些相互矛盾,例如:
美国人:MM / DD / YY 英国人:DD / MM / YY
当然,您可以尝试猜测格式或尝试使用Windows设置,但在某些情况下两者都会失败。让用户配置格式,强制文件结构声明格式或仅支持一种格式(最好是一些国际标准,例如ISO 8601 YYYY-MM-DD)。