【问题标题】:Delphi require 4 digit yearDelphi 需要 4 位数年份
【发布时间】:2014-08-18 15:34:33
【问题描述】:

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

为了消除歧义,如何要求用户输入 4 位数的年份?

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

【问题讨论】:

  • @TLama 我的意思是一个包含 2 位数年份的日期,例如 8/18/64。编辑问题以试图澄清
  • 使用要求 4 位数年份的格式字符串。但是你必须选择格式字符串。你想这样做吗?
  • @DavidHeffernan 可以选择,但我不知道如何在格式字符串中强制使用 4 位数年份。我的默认 ShortDateFormat 是 M/d/yyyy 但 StrToDate 不需要 4 位数的年份。格式字符串是否有一些语法来使 4 位 yyyy 需要?
  • 那你就需要自己解析字符串了。
  • 为什么不改用TDateTimePicker?它专为日期/时间输入而设计。

标签: delphi


【解决方案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 格式,则不会出错。

【讨论】:

    【解决方案2】:

    一种可能性是这样的:

    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 格式(在某些国家/地区,“/”可能是“-”)。

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

    【讨论】:

    • 如果 ShortDateFormat 不是“M/d/yyyy”,我添加了一个例外。如果对其他日期格式的支持成为问题,我会在它们出现时添加它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多