“出生日期”验证:您会走多远/做多少?

18

我对表单验证非常严格。因此,在为当前项目中的申请表单创建“出生日期”(DOB)字段的验证器时(在这种情况下,平台/语言是中性的),我想要防止'淘气'输入。

我使用了一个日期选择器,并将最大日期限制为距离当前日期XX年。对于此场景来说,XX是有意义的,因为任何年龄小于此年龄的人都不应该申请该工作。

验证错误消息是:“您似乎太年轻了,无法申请此工作。”

然后我开始冒险。如何呢?

如果DOB早于120年前,则显示消息:“您不可能那么老!!!”

如果DOB在未来,则显示消息:“你一定在开玩笑,你还没有出生!!!”

最终,我没有部署最后两个,因为它们对我的认真客户来说太过俏皮。

我想知道,为了良好的可用性(或幽默),你们会走多远/多少来验证DOB字段,以及如“婚姻日期”,“毕业年份”等日期的情况。

另外:

我很惊讶大多数人对验证并不太关注。我在这里重复我的评论:

如果用户输入的日期错误(非常明显),无论是故意还是错误,验证器的目的之一就是捕捉它。当数据进入系统时,站点所有者只知道输入是错误的,他/她不会知道实际值而不询问用户。如果此字段非常重要,则情况将不会很好。


3
我不主张尝试验证正确性(而不是有效性)的原因与你提出的相同:网站所有者不知道正确的价值。因此,你如何验证正确性呢?当然,根据你的应用程序,可能会有一些“安全保障”,但这完全取决于你的应用程序的功能。例如,有人购买了医疗软件和未出生的婴儿。还有数百年或数千年前出生的历史人物(在这种情况下,你可能也有DoD,但那是另一个问题)。 - Matthew Scharley
@Matthew:同意。事实上,我刚想到一些情况,其中出生日期可能超过200年或为负数。例如,“你已故祖父的出生日期”或“你未出生婴儿的预计出生日期”。因此,在不同的上下文中,出生日期需要不同的验证器,从最简单的确保日期是有效的,到日期范围的验证。 - o.k.w
询问求职者的年龄是否违法?我认为在网上求职表格中这样做也同样违法。 - jmucchiello
@jmucchiello:合法性是主观的,不同的地区有不同的劳动法律。在我所在的地方并不违法。 :) - o.k.w
3
让·卡门活了 122 岁(请参见 http://en.wikipedia.org/wiki/Jeanne_Calment)。 - Daniel Daranas
1
她在100岁之后申请过任何工作吗? - Adam
17个回答

19

想想你填写表格的时候。有多少次你因为一些“太聪明”的程序员插入了一些对你的情况不正确的“验证”而感到沮丧?我认为,应该相信用户。说起来,随着时间的推移,我想人们活得更久,并且以更早的年龄上网。 :P


9
我特别讨厌那些不允许使用加号或连续两个点等符号进行电子邮件验证的方式......仅仅想到这些我就感到非常愤怒。 - sbk
8
可以添加一个年份下拉框,因为有些人认为这样更方便。但对于一些人来说,他们得不停地向下滚动才能找到自己的出生年份,这真的很让人沮丧。 - Martin Beckett

12

不要忘记你也可以警告用户不要输入不太可能的值。在大多数情况下,打错字比故意使人为难更有可能发生。

因此,对于您的应用程序,可能需要这样:

  • 年龄 < 最小申请年龄 - 错误
  • 年龄 > 常见退休年龄 - 警告
  • 年龄 > 预期寿命 - 错误

1
最好使用JavaScript立即进行警告,而无需加载页面。 - Adam

10

验证与正确性
输入验证的目的在于确保所有元素都在允许范围内并符合进一步处理所需的期望-即,如果您的数据库“保证”数据库中的所有申请人都是18岁或以上,请进行验证。如果您的数据库还接受学生申请实习,则不应该。

任何异常值都只是一个警告。是的,120岁的年龄值非常不合理,您应该向用户发出警告,并可能将此记录标记为可疑/待审核。然而,拒绝它是没有意义的(除非您有一个业务规则,例如所有申请人都必须小于70岁)。

虚假信任
想象一下,如果您告诉一个用户“您在输入时排除了不太可能的出生日期”,她可能会告诉她的同事DOB已经“通过验证”。他最终对申请人年龄为90岁产生了毫无根据的信任,如果这是一个伪造的记录,您本来应该拒绝它。

所有进一步的处理-无论是由人还是计算机完成-仍必须假定DOB可能不正确-只因为打错字。您正试图创建一种您实际上无法保证的保证。许多用户更信任他们每天使用的计算机,而不是陌生人,您正在试图执行这种信任-这在我看来是一个谬论。

转化
许多应用程序的寿命比最初设想的要长得多,并且有些将被用于超出实现者最疯狂想象的目的。在其中加入人为限制既不会简化实际处理也不会简化操作员的工作。

(这可能使我成为您客户的勇斗派类别-但那是我的方式“过分强调验证”:知道什么时候停止:))


@peterchen:感谢您深思熟虑的回复。我描述的例子只是一个例子而已。虽然我们无法确定出生日期是否真实,但根据上下文,我们可以确定它是否不可能是真实的。一个人确实可能会忘记自己的生日,但仍能提交一个有效但错误的出生日期表单。无论如何,我可以告诉您,在验证的广度方面,您不会走得太远。 :) - o.k.w

7
我认为验证非常重要,但在你的情况下不一定需要。这并不是说你的情况微不足道,只是我有自己关于日期排序的问题。
具体来说,我的关注点始终是保持逻辑顺序。如果有人说他们出生于1802年,那很好(有点),但我希望他们的毕业日期大于出生日期。但当涉及到时间(如小时和分钟)时,就会遇到讨厌的小问题,例如,如果用户选择8:30作为开始时间,然后选择9:15作为结束时间,但随后意识到结束时间是8:45。他们决定将9更改为8,并打算更改分钟为:45。但我的验证脚本太忙了,正在说“等等!8:15在8:30之前,好尝试!”但我不能冒险让他们离开错误,等等。
对于你的情况,我会倾向于道德正确。因为正如已经指出的那样,有人可能正在输入家庭历史(其中包括1600年代的出生日期)或未来的购买记录(包括今天之后的日期),因此总体上没有现实限制。但是你的情况有限制,即:
如果年龄低于合法工作年龄(美国大部分地区为16岁),则不要提供高于该年份的选项(如果您使用下拉列表)。
如果年龄超过合理工作年龄(可能是一个敏感话题),则根据退休年龄提供最高价值,并在该年份前面简单地添加“>”。如果有人已经75岁并申请行政级别的工作,他们会更喜欢你让事情变得简单,而不是因为你没有列出他们的出生年份而感到冒犯。如果有什么的话,他们会印象深刻(我认为)你采取了这种方式,而不是什么都没有,暗示他们不应该浪费时间。
最后,你有一个非常容易编写的简单下拉列表(PHP示例)。
$currentYear = date('Y');

    echo "<select name=\"YearOfBirth\">";

for($i = 16; $i <= 64; $i++) {
    $optionYear = $currentYear - $i;
    echo "<option value=\"$optionYear\">$optionYear</option>";
    }

    $greaterYear = $currentYear - 65;
    echo "<option value=\"&gt;$greaterYear\">&gt;$greaterYear</option>";

    echo "</select>";

@Anthony:措辞得当。感谢您从新的角度提供的见解。 - o.k.w

5
当询问活着的人的出生日期时,只拒绝明显错误的值。任何未来的出生日期都是明显错误的。我会划定一个界限,并说在(比如)1880年之前的任何出生日期都是明显错误的。其他任何日期都是有效的出生日期。
因此,任何未通过上述测试的出生日期都将被拒绝,并在字段级别显示消息,例如“此日期在未来/过于久远。请输入您的出生日期。”
任何其他出生日期都是有效的(也许用户确实只有11岁或108岁)。但整个表格可能会被业务规则拒绝。例如,“您必须至少18岁才能申请”。
这个想法是要将单个字段验证与表单验证分离。混淆它们会产生复杂的规则。分离意味着你可以在其他情境中重用字段的规则(例如,“活着的人的出生日期必须在1880年1月1日和今天之间”)。

4

如果您在进行任何职业相关的事情 - 比如求职申请 - 我建议在与用户通信时不要使用 "!"。看看您喜欢的任何精美网站,您不会发现它经常被使用。


2

有效日期:检查

日期不在将来:可能(我处理医疗应用程序,所以我想您可能正在处理未出生的婴儿)

日期不早于120年:很可能

我不太喜欢过度设计这些东西,特别是如果用户的错误相对无害,并且可以轻松发现和修复。 不管怎样,这就是我的方法。


我同意。验证有效数据,而不是正确数据。你无法确定你的有效数据是正确还是错误的,而且你最终会被虚假负面结果所困扰。 - Matthew Scharley
@Deeksy:如果用户输入日期错误(非常明显的错误),那么这就是验证器的一个目的之一,用于捕捉它。当数据进入系统时,站点所有者只知道输入有误,他/她不会知道实际值,除非询问用户。 - o.k.w
未出生的婴儿没有出生日期。他们可能有预产期,但那是另一回事! - Bennett McElwee

2

有效日期:

我会进一步检查这个日期是否存在,例如闰年的2月29日等等。

未来日期:

通常我们会检查年龄(今年减去给定的出生日期),必须达到一定年龄才能注册。

超过120岁的日期或不是:

我不会检查。200年可能是更安全的限制?(以防一个121岁的人想使用计算机 *咯咯笑*)


2

在设计验证时,我认为您应该考虑实际需求。如果字段是日期字段(或者更重要的是,如果它存储了一个日期,但某个不太出色的数据库管理员将其设置为varchar),请确保仅提交有效日期。这很关键。无效日期会导致查询数据时出现各种问题。如果日期必须发生在过去,则将日期范围限制为当前日期或更早。

之后,按照客户的要求进行。如果他们愿意支付你来排除未达到工作年龄的人,他们会告诉你的。不允许设定最高年龄限制可能会使您涉及年龄歧视的法律问题。客户也可能不希望您这样做。


完全同意,特别是关于法律要求的部分。例如,银行在年龄验证方面有监管和法律要求,必须实施。做好专业工作,了解要求,然后实施它们。 - razlebe

1
以下是在验证出生日期时可以执行的检查:
从出生日期计算年龄,进行以下检查
年龄 > XX [XX 是申请所需的最低年龄]
年龄 < XX {应抛出一条消息,说明您还不够年轻}
年龄 = XX
如果没有上限年龄,则可以将其视为退休年龄,否则请验证下一两个检查的上限年龄
年龄 < 退休年龄
年龄 > 退休年龄 {应该抛出一条消息,说明您年龄太大无法申请}
年龄 = 退休年龄
DOB是有效日期(通过提供有效日期)
DOB无效 -
Enter 0 in either of day/month/Year

Enter some negative Value

Enter some invalid date e.g. 30th feb or 32 Jan etc

Enter valid date with different separators (although the date is a valid one but due to different separators it will become an invalid one)

输入不同格式的日期,例如dd/mm/yyyy、dd/mm/yy、dd/MON/yyyy等。

输入一些未来的日期(这里无效,因为您的目的是不同的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接