8

I have the following. For some reason, moment.js isnt validating my dates as expected. When i pass letters, it fails like its supposed to, but when using digits only, it always passes.

I'm using the MMDDYYYY format. How do I validate MMDDYYYY using moment? Thanks

var dates = "08291975"; //passes as it should
var passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should pass ' + passed); //actual output is 'should pass true'

dates = "082919751"; //one digit too many should fail but doesnt
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed); //actual output is 'should not pass true'

dates = "0829ssss"; //fails as expected
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed); //actual output is 'should not pass false'

dates = "0829197"; //one digit short should fail but doesnt
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed); //actual output is 'should not pass true'
<script src="https://rawgit.com/moment/moment/2.2.1/min/moment.min.js"></script>
mplungjan
  • 169,008
  • 28
  • 173
  • 236
BoundForGlory
  • 4,114
  • 15
  • 54
  • 81

4 Answers4

4

You can have the expected output using last vesion (2.24.0), instead of the old 2.2.1.

Here a live sample:

var dates = "08291975";
var passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should pass ' + passed);

dates = "082919751"; //one extra digit
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed);

dates = "0829ssss";
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed);

dates = "0829197"; //one digit missing
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed);
<script src="https://rawgit.com/moment/moment/2.24.0/min/moment.min.js"></script>
VincenzoC
  • 30,117
  • 12
  • 90
  • 112
1

This is a known issue with the momentJS library. Your code should work fine with version 2.3 +. https://github.com/moment/moment/issues/1363

Kevin.a
  • 4,094
  • 8
  • 46
  • 82
1

Change the script version. It will work fine. Look at the output now.

var dates = "08291975"; //passes as it should
var passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should pass ' + passed); //actual output is 'should pass true'

dates = "082919751"; //one digit too many should fail but doesnt
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed); //actual output is 'should not pass true'

dates = "0829ssss"; //fails as expected
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed); //actual output is 'should not pass false'

dates = "0829197"; //one digit short should fail but doesnt
passed = moment(dates, 'MMDDYYYY', true).isValid();
console.log('should not pass ' + passed);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
tuhin47
  • 5,172
  • 4
  • 19
  • 29
1

Just because - no moment:

const testDate = (str => {
  if (str.length !== 8 || isNaN(str)) return false;

  const [, mm, dd, yyyy] = str.match(/^(\d\d)(\d\d)(\d{4})$/);
  const d = new Date(yyyy, mm - 1, dd, 12, 0, 0, 0);
  console.log(str, d.toLocaleDateString());
  return d.getDate() === +dd && (d.getMonth() + 1) === +mm && d.getFullYear() === +yyyy;
});

["08291975", "082919751", "0829ssss", "0829197", "02291975", "02292000","10312019","12345678"].forEach(d => console.log(d, testDate(d)));
mplungjan
  • 169,008
  • 28
  • 173
  • 236