德尔福需要4位数年份

时间:2014-08-18 15:34:33

标签: delphi

用户将输入日期的字符串值。 StrToDate将用于将字符串值转换为DateTime。如果用户输入具有2位数年份的日期,则可以将日期解析为当前世纪(20xx)或上个世纪(19xx)。

要清除任何歧义,如何要求用户输入4位数年份?

if isFourDigitYear(txbDate.Text) then
  date := StrToDate(txbDate.Text)
else
  ShowMessage('enter date with 4 digit year');

2 个答案:

答案 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;可能是" - "在某些国家/地区。)

如果你想要一个真正的国际函数,它还检查四位数部分是否实际上是当前有效日期格式的年份部分,那么它需要一个更复杂的解析器。以上可能会让你开始,但是......