AngularJS: How to validate date in US format?

31,987

Solution 1

The accepted answer doesn't work for me. I changed to:

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

Otherwise only people born after 1990 need apply!

Solution 2

Your ng-pattern worked in a fiddle I created, but it allows for some incorrect dates, such as 0/9/1993 and 19/2/1993.

Here's a better pattern: (note, it was updated to match @WillSadler's answer)

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

Fiddle.

Share:
31,987
mikhail-t
Author by

mikhail-t

Updated on May 19, 2020

Comments

  • mikhail-t
    mikhail-t about 4 years

    I have the following form code that allows input of a date using AngularUI (date is required and should match US date format e.g.: 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>
    

    Validation for required field works fine, but date format is not being validated correctly and always shows 'Incorrect Format...' message.

    I tried several different Regular Expressions that worked fine elsewhere, but it is still not working. Also I tried AngularUI validation and it doesn't work either. Thanks in advance!

    UPDATE:

    I figured that validation was conflicting with AngularUI datepicker I used, but datepicker autocorrects date anyway, so if datepicker is not used, than validation works as long as regular expression works, and if datepicker is used, there is not much need for other validation.

  • Rob Bygrave
    Rob Bygrave about 11 years
    I believe the pattern above needs a slight tweek - an additional () around the year part so that it becomes: /^(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/((199\d)|([2-‌​9]\d{3}))$/
  • Mark Rajcok
    Mark Rajcok about 11 years
    @Rob, the pattern worked (because the alternation at the end doesn't have to be enclosed in parenthesis), but I do see your point, so I made the pattern more consistent -- the alternate year patterns are now enclosed in one set of parenthesis like the the month and day.
  • eomeroff
    eomeroff over 10 years
    There is form.$invalid, just sayin
  • Keith
    Keith over 9 years
    Warning: This regex does not allow dates before 1/1/1990. That might be fine for the OP but not for a general use case. Good answer, I just think the question is misleading.
  • i.am.michiel
    i.am.michiel over 8 years
    CAREFULL ! This pattern does not work. No dates after the 28th are accepted. Try for instance the 29/03/1963. regex101.com/r/bO6rY5/1
  • Mark Rajcok
    Mark Rajcok about 8 years
    Thanks @Keith, updated to match WillSadler's answer.