验证实际日期

时间:2011-11-05 14:50:08

标签: delphi delphi-xe2

是否有某些功能能够以格式aaaa / mm / gg(ccyy / mm / dd)验证日期,如果有效则返回True,否则返回False?我的意思是关于真正有效的日期,不仅仅是语法水平。

4 个答案:

答案 0 :(得分:7)

'aaaa'年和'gg'日?

var
  MyString: string;
  MyDate: TDateTime;
  settings: TFormatSettings;
begin
  settings.ShortDateFormat := 'yyyy/mm/dd';
  settings.DateSeparator := '/';
  MyString := '2011/15/15';
  if TryStrToDateTime(MyString, MyDate, settings) then
    Label1.Caption := 'correct date'
  else
    Label1.Caption := 'incorrect';
end;

答案 1 :(得分:3)

这非常快,因为最先捕获的是最简单的错误。

function IsValidDate(const S: string): boolean;
var
  y, m, d: Integer;
const
  DAYS_OF_MONTH: array[1..12] of integer = (31, 29, 31, 30, 31, 30, 31, 31, 30,
  31, 30, 31);
begin
  result := false;
  if length(S) <> 10 then Exit;
  if (S[5] <> '/') or (S[8] <> '/') then Exit;
  if not TryStrToInt(Copy(S, 1, 4), y) then Exit;
  if not TryStrToInt(Copy(S, 6, 2), m) then Exit;
  if not InRange(m, 1, 12) then Exit;
  if not TryStrToInt(Copy(S, 9, 2), d) then Exit;
  if not InRange(d, 1, DAYS_OF_MONTH[m]) then Exit;
  if (not IsLeapYear(y)) and (m = 2) and (d = 29) then Exit;
  result := true;
end;

答案 2 :(得分:2)

使用具有TFormatSettings参数的重载版本的StrToDate()。然后你可以传入所需的格式字符串进行解析,并在验证解析后的值后返回一个TDateTime。

答案 3 :(得分:0)

尝试做同样的事情并跑过这个旧线程。我最后编写了自己的函数,并认为我会发布它。怎么样?

function IsValidDate(const S: string): boolean;
 var TestDate : tdatetime;
begin
 Result := False;

 if (LastDelimiter('/',S) >= 4) 
 and 
 (Length(S)-LastDelimiter('/',S) >= 4) 
 then

  Result := TryStrToDate(S,TestDate);

 end;

首先,我检查第二个分隔符(/)是否至少足以代表一天和一个月(第四个位置)。然后,我用下一行强制他们用了4位数的年份。将第二个测试更改为&gt; = 2为两位数,但我只是认为强制四位数年份并不是那么糟糕 - 它只有两个笔画。

最后,我使用TryStrToDate()进行测试。如果只有一个分隔符,或者它不是有效日期,则会在此处捕获。

如果你想获得幻想,你可以检查这一年是否在过去10年内或者其他什么。只需添加:

Result := Result and (Now - TestDate < 3650);

戴夫