是否有某些功能能够以格式aaaa / mm / gg(ccyy / mm / dd)验证日期,如果有效则返回True
,否则返回False
?我的意思是关于真正有效的日期,不仅仅是语法水平。
答案 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);
戴夫