用户将输入日期的字符串值。 StrToDate将用于将字符串值转换为DateTime。如果用户输入具有2位数年份的日期,则可以将日期解析为当前世纪(20xx)或上个世纪(19xx)。
要清除任何歧义,如何要求用户输入4位数年份?
if isFourDigitYear(txbDate.Text) then
date := StrToDate(txbDate.Text)
else
ShowMessage('enter date with 4 digit year');
答案 0 :(得分:1)
我认为最好的选择是使用TDateTimePicker
http://docwiki.embarcadero.com/Libraries/XE6/en/Vcl.ComCtrls.TDateTimePicker
如果你使用旧的Delphi而不是Delphi 2009和更新包3那么你会想读下一篇文章来修复在TDateTimePicker中发现的错误。
http://www.tmssoftware.com/site/blog.asp?post=117
此错误已在较新版本中修复。
现在,如果您正在使用FireMonkey,请注意在Delphi XE3中使用TDateTimePicker,它有一个错误,可以通过键盘输入日期(鼠标仍然可以选择)。我不确定这是否已经在以后版本的Delphi中修复过。
如果使用TDateTimePicker是不可能的,那么肯定使用TMaskedEdit而不是常规TEdit,因为所选的掩码迫使用户以正确的格式输入文本。
http://docwiki.embarcadero.com/CodeExamples/XE6/en/EditMask_(Delphi)
编辑:使用TDateTimePicker的最大好处是它会自动使用在特定系统上设置的日期时间格式。
这意味着使用的日期时间格式将是用户习惯的格式。因此,如果用户本地设置使用dd / mm / yy格式而不是mm / dd / yy,则不会出现错误。
答案 1 :(得分:0)
一种可能性是:
FUNCTION IsFourDigitYear(DateStr : STRING ; DateSep : CHAR = '/') : BOOLEAN;
VAR
P : Cardinal;
BEGIN
DateStr:=DateStr+DateSep; Result:=TRUE;
REPEAT
P:=POS(DateSep,DateStr);
IF P=5 THEN EXIT;
DELETE(DateStr,1,P)
UNTIL DateStr='';
Result:=FALSE
END;
它将检查给定字符串的一部分是否有4个字符。
它目前不会检查该部分是否为数字(即仅包含数字)。如果您希望它真正具有国际性,它将要求您传递所使用的分隔符 - 有些国家/地区使用' - '作为日期分隔符,世界上大多数其他国家并不使用奇怪的M / D / Y格式,而是使用D / M / Y或Y / M / D格式(其中" /&# 34;可能是" - "在某些国家/地区。)
如果你想要一个真正的国际函数,它还检查四位数部分是否实际上是当前有效日期格式的年份部分,那么它需要一个更复杂的解析器。以上可能会让你开始,但是......