【问题标题】:Specific validation of dates using TryStrToDate使用 TryStrToDate 对日期进行特定验证
【发布时间】:2013-10-08 23:05:18
【问题描述】:

我正在尝试验证用户使用 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

这很好用,但还有一个数据实例是通过 XML 从 .csv 文件导入的,它可以具有任何格式。

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

fs.ShortDateFormat := 'mm/dd/yyyy';

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

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

error := not TryStrToDate(tempStr, tempDate, fs);

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

非常感谢任何帮助!

顺便说一下,我使用的是 Delphi 7。

【问题讨论】:

  • 欢迎来到 StackOverflow。你需要edit你的问题更具体。 “进口日期”是什么意思?您如何导入它们以及从哪里导入它们?您尝试过哪些不适合您的代码?编写一个函数以在 StrToDate 有效时返回 true 或在失败时返回 false 非常简单,但是您没有提供足够的信息来判断这是否是正确的解决方案。
  • if length(importedDateString) <> 10 then Result:= false;
  • 抱歉,这样更好吗?
  • 对不起,约翰,我刚看到你的评论。我还需要验证日期以确保它确实存在。
  • 为什么您需要如此坚持正确的日期格式?如果用户未能在原本是一位数的数字上输入前导零,为什么这很重要?你的日期解析功能不在乎,为什么还要添加更多繁文缛节?

标签: delphi validation delphi-7 tdatetime


【解决方案1】:

创建这个函数:

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.');

【讨论】:

  • 实现我自己修复的更好方法。谢谢!
【解决方案2】:

关于你的第二个问题:

如果您不知道输入文件使用哪种日期格式,这会给您带来很大的痛苦。有许多日期格式,其中一些相互矛盾,例如:

美国:MM/DD/YY 英国:DD/MM/YY

当然,您可以尝试猜测格式或尝试使用 Windows 设置,但在某些情况下两者都会失败。要么让用户配置格式,强制文件结构声明格式,要么只支持一种格式(最好是一些国际标准,例如ISO 8601YYYY-MM-DD)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多