Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion src/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -1383,7 +1383,36 @@ $.extend( $.validator, {

// https://jqueryvalidation.org/dateISO-method/
dateISO: function( value, element ) {
return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
if ( this.optional( element ) ) {
return true;
}
var check = false,
re = /^(\d{4})(?:-){1}(0[1-9]|1[012])(?:-){1}(0[1-9]|[12][0-9]|3[01])$/,
adata,
yyyy,
mm,
dd,
isLeap;
if ( re.test( value ) ) {
check = true;

// Do a sanity check to ensure the date is valid
adata = value.match( re );
yyyy = parseInt( adata[ 1 ], 10 );
mm = parseInt( adata[ 2 ], 10 );
dd = parseInt( adata[ 3 ], 10 );

if ( ( mm === 4 || mm === 6 || mm === 9 || mm === 11 ) && dd === 31 ) {
check = false;
} else if ( mm === 2 ) {
isLeap = ( yyyy % 4 === 0 && ( yyyy % 100 !== 0 || yyyy % 400 === 0 ) );

if ( dd > 29 || ( dd === 29 && !isLeap ) ) {
check = false;
}
}
}
return check;
},

// https://jqueryvalidation.org/number-method/
Expand Down
17 changes: 13 additions & 4 deletions test/methods.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,16 +192,25 @@ QUnit.test( "dateISO", function( assert ) {
assert.ok( method( "1990-01-31" ), "Valid date" );
assert.ok( method( "1990-12-01" ), "Valid date" );
assert.ok( method( "1990-12-31" ), "Valid date" );
assert.ok( method( "1990/06/06" ), "Valid date" );
assert.ok( method( "1990-6-6" ), "Valid date" );
assert.ok( method( "1990/6/6" ), "Valid date" );
assert.ok( !method( "1990/06/06" ), "Invalid date" );
assert.ok( !method( "1990-6-6" ), "Invalid date" );
assert.ok( !method( "1990/6/6" ), "Invalid date" );
assert.ok( !method( "1990-106-06" ), "Invalid date" );
assert.ok( !method( "1990-06-106" ), "Invalid date" );
assert.ok( !method( "190-06-06" ), "Invalid date" );
assert.ok( !method( "1990-00-06" ), "Invalid date" );
assert.ok( !method( "1990-13-01" ), "Invalid date" );
assert.ok( !method( "1990-01-00" ), "Invalid date" );
assert.ok( !method( "1990-01-32" ), "Invalid date" );
assert.ok( !method( "1990-13-32" ), "Invalid date" );
assert.ok( !method( "1990-13-01" ), "Invalid date" );
assert.ok( !method( "19990-01-01" ), "Invalid date" );
assert.ok( method( "1992-02-29" ), "Valid divide-by-4 leap day" );
assert.ok( !method( "1990-02-29" ), "Invalid divide-by-4 leap day" );
assert.ok( method( "2000-02-29" ), "Valid end-of-century leap day" );
assert.ok( !method( "1900-02-29" ), "Invalid end-of-century leap day" );
assert.ok( !method( "2100-02-29" ), "Invalid divide-by-100 leap day" );
assert.ok( method( "1990-10-31" ), "Valid last day of month" );
assert.ok( !method( "1990-09-31" ), "Invalid last day of month" );
} );

/* Disabled for now, need to figure out how to test localized methods
Expand Down