AngularJS:如何验证美国日期格式?

11

我有以下表单代码,使用AngularUI允许输入日期(日期为必填项,应与美国日期格式匹配,例如:MM/DD/YY):

<form name="form" ng-submit="createShipment()">
    <!-- Shipment Date must be in MM/DD/YY format: -->  
    <input name="shipmentDate" 
          ng-pattern='/^[0,1]?\d{1}\/(([0-2]?\d{1})|([3][0,1]{1}))\/(([1]{1}[9]{1}[9]{1}\d{1})|([2-9]{1}\d{3}))$/'
          ui-date="{ dateFormat: 'mm/dd/y' }" required ng-model="shipment.ShipmentDate" type="text">
    <span ng-show="form.shipmentDate.$error.required">Date Required!</span>
    <span ng-show="form.shipmentDate.$error.pattern">Incorrect Format, should be MM/DD/YY!</span>

    <input class="btn-primary" ng-hide="!form.$valid" type="submit" value="Create">
</form>

必填字段的验证正常,但日期格式验证未正确进行,始终显示“格式不正确...”消息。

我尝试了几种在其他地方有效的正则表达式,但它仍然无法正常工作。 我还尝试了AngularUI验证,但它也不起作用。提前致谢!

更新:

我发现验证与我使用的AngularUI日期选择器冲突,但是日期选择器会自动更正日期,因此如果不使用日期选择器,则只要正则表达式起作用,验证就可以正常工作;如果使用日期选择器,则没有太多需要进行其他验证。


ng-pattern?这是你自己的实现吗?还是来自angular-ui? - asgoth
1
ng-pattern是Angular的一部分,但并不是很常见。请参阅http://docs.angularjs.org/cookbook/form以获取示例。它也在“input”API页面上提到,例如http://docs.angularjs.org/api/ng.directive:input。 - Mark Rajcok
3个回答

20

你的ng-pattern在我创建的示例中起作用了,但它允许一些不正确的日期,比如0/9/1993和19/2/1993。

这里有一个更好的模式:(请注意,已更新以匹配@WillSadler的答案)

^(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/((19\d{2})|([2-9]\d{3}))$

Fiddle


我认为上面的模式需要稍微调整一下——在年份部分周围添加一个额外的括号,使其变为:/^(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01])/((199\d)|([2-9]\d{3}))$/ - Rob Bygrave
@Rob,这个模式是有效的(因为结尾的可选项不必放在括号中),但我理解你的意思,所以我让这个模式更加一致了——现在,年份的可选项和月份、日期一样都放在一个括号里。 - Mark Rajcok
有一个表单.$invalid,只是说一下。 - eomeroff
4
警告:这个正则表达式不允许匹配1990年1月1日之前的日期。对于提问者来说可能没问题,但是对于一般情况就不太合适了。回答很好,只是我认为问题有误导性。 - Keith
谢谢@Keith,已更新以匹配WillSadler的答案。 - Mark Rajcok

2
接受的答案对我无效。 我改为:
^(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/((19\d{2})|([2-9]\d{3}))$

否则,只有1990年后出生的人才需要申请!

-1

检查闰年验证:日期格式:dd-mm-yyyy

正则表达式模式:^(0?[1-9]|1\d|2[0-8]|29(?=[-]\d?\d[-](?!1[01345789]00|2[1235679]00)\d\d(?:[02468][048]|[13579][26]))|30(?![-]0?2)|31(?=[-]0?[13578]|[-]1[02]))[-](0?[1-9]|1[0-2])[-]([12]\d{3})$

演示

另一个演示


小心!这个模式不起作用。28日之后的日期是不被接受的。尝试一下例如:29/03/1963。https://regex101.com/r/bO6rY5/1 - i.am.michiel

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