使用 TryStrToDate 对日期进行特定验证

Ale*_*ski 3 delphi validation delphi-7 tdatetime

我正在尝试使用 TryStrToDate 验证用户输入的日期,以确保它们可以正确显示在我正在处理的应用程序的屏幕上,但不知道它究竟是如何工作的。当输入的有效日期不完全是 10 个字符时,我希望能够返回 False。

例如,09/02/2012 将返回 True,但 09/2/2012 或 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
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但也有一个数据实例从 .csv 文件通过 XML 导入,它可以具有任何类型的格式。

我当前的解决方案似乎仍然有效,但我想知道是否有一种方法可以通过仅使用 TryStrToDate 并让它只接受我需要的 10 个字符格式的有效日期来最小化处理。我试过手动设置短日期格式:

fs.ShortDateFormat := 'mm/dd/yyyy';
Run Code Online (Sandbox Code Playgroud)

但 TryStrToDate 始终接受有效日期,即使它们的长度不是 10 个字符。

我的理想解决方案是将其保持为:

error := not TryStrToDate(tempStr, tempDate, fs);
Run Code Online (Sandbox Code Playgroud)

只是想知道是否可以使用 TryStrToDate 或其他一些 delphi 函数。

任何帮助是极大的赞赏!

顺便说一下,我正在使用 Delphi 7。

Dal*_*e M 5

创建这个函数:

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;
Run Code Online (Sandbox Code Playgroud)

用法示例:

if IsValidDateCheck(tempStr) then
  ShowMessage(tempStr + ' is a valid date.')
else
  ShowMessage(tempStr + ' is not a valid date.');
Run Code Online (Sandbox Code Playgroud)