Skip to content

Commit 862121e

Browse files
Datepicker: Parse dates before year 100
4-digit years, unix times, and windows times now handle years between 0 and 99. Additionally, negative unix times can be parsed.
1 parent ea75bd3 commit 862121e

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

tests/unit/datepicker/helper.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ return $.extend( helper, {
1818
assert.ok( false, message + " - missing date" );
1919
return;
2020
}
21-
d1 = new Date( d1.getFullYear(), d1.getMonth(), d1.getDate() );
22-
d2 = new Date( d2.getFullYear(), d2.getMonth(), d2.getDate() );
21+
d1 = $.datepicker._newDate( d1.getFullYear(), d1.getMonth(), d1.getDate() );
22+
d2 = $.datepicker._newDate( d2.getFullYear(), d2.getMonth(), d2.getDate() );
2323
assert.equal( d1.toString(), d2.toString(), message );
2424
},
2525

tests/unit/datepicker/options.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,7 @@ QUnit.test( "iso8601Week", function( assert ) {
926926
} );
927927

928928
QUnit.test( "parseDate", function( assert ) {
929-
assert.expect( 26 );
929+
assert.expect( 29 );
930930
testHelper.init( "#inp" );
931931
var currentYear, gmtDate, fr, settings, zh;
932932
assert.ok( $.datepicker.parseDate( "d m y", "" ) == null, "Parse date empty" );
@@ -953,6 +953,8 @@ QUnit.test( "parseDate", function( assert ) {
953953
testHelper.equalsDate( assert, $.datepicker.parseDate( "'day' d 'of' MM (''DD''), yy",
954954
"day 3 of February ('Saturday'), 2001" ), new Date( 2001, 2 - 1, 3 ),
955955
"Parse date 'day' d 'of' MM (''DD''), yy" );
956+
testHelper.equalsDate( assert, $.datepicker.parseDate( "yy-mm-dd", "0001-02-03" ),
957+
$.datepicker._newDate( 1, 2 - 1, 3 ), "Parse ancient date yy-mm-dd" );
956958
currentYear = new Date().getFullYear();
957959
testHelper.equalsDate( assert, $.datepicker.parseDate( "y-m-d", ( currentYear - 2000 ) + "-02-03" ),
958960
new Date( currentYear, 2 - 1, 3 ), "Parse date y-m-d - default cutuff" );
@@ -972,6 +974,9 @@ QUnit.test( "parseDate", function( assert ) {
972974
gmtDate.setMinutes( gmtDate.getMinutes() - gmtDate.getTimezoneOffset() );
973975
testHelper.equalsDate( assert, $.datepicker.parseDate( "@", "981158400000" ), gmtDate, "Parse date @" );
974976
testHelper.equalsDate( assert, $.datepicker.parseDate( "!", "631167552000000000" ), gmtDate, "Parse date !" );
977+
gmtDate = $.datepicker._newDate( 1, 2 - 1, 3 );
978+
testHelper.equalsDate( assert, $.datepicker.parseDate( "@", "-62132724000000" ), gmtDate, "Parse ancient date @" );
979+
testHelper.equalsDate( assert, $.datepicker.parseDate( "!", "28728000000000" ), gmtDate, "Parse ancient date !" );
975980

976981
fr = $.datepicker.regional.fr;
977982
settings = { dayNamesShort: fr.dayNamesShort, dayNames: fr.dayNames,

ui/widgets/datepicker.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,7 @@ $.extend( Datepicker.prototype, {
11511151
monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,
11521152
monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,
11531153
year = -1,
1154+
isFullYear = false,
11541155
month = -1,
11551156
day = -1,
11561157
doy = -1,
@@ -1172,11 +1173,14 @@ $.extend( Datepicker.prototype, {
11721173
size = ( match === "@" ? 14 : ( match === "!" ? 20 :
11731174
( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
11741175
minSize = ( match === "y" ? size : 1 ),
1175-
digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
1176+
digits = new RegExp( "^" + (match === "@" ? "-?" : "") + "\\d{" + minSize + "," + size + "}" ),
11761177
num = value.substring( iValue ).match( digits );
11771178
if ( !num ) {
11781179
throw "Missing number at position " + iValue;
11791180
}
1181+
if ( match === "y" ) {
1182+
isFullYear = isDoubled;
1183+
}
11801184
iValue += num[ 0 ].length;
11811185
return parseInt( num[ 0 ], 10 );
11821186
},
@@ -1243,12 +1247,14 @@ $.extend( Datepicker.prototype, {
12431247
case "@":
12441248
date = new Date( getNumber( "@" ) );
12451249
year = date.getFullYear();
1250+
isFullYear = true;
12461251
month = date.getMonth() + 1;
12471252
day = date.getDate();
12481253
break;
12491254
case "!":
12501255
date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 );
12511256
year = date.getFullYear();
1257+
isFullYear = true;
12521258
month = date.getMonth() + 1;
12531259
day = date.getDate();
12541260
break;
@@ -1274,7 +1280,7 @@ $.extend( Datepicker.prototype, {
12741280

12751281
if ( year === -1 ) {
12761282
year = new Date().getFullYear();
1277-
} else if ( year < 100 ) {
1283+
} else if ( year < 100 && !isFullYear ) {
12781284
year += new Date().getFullYear() - new Date().getFullYear() % 100 +
12791285
( year <= shortYearCutoff ? 0 : -100 );
12801286
}
@@ -1292,7 +1298,7 @@ $.extend( Datepicker.prototype, {
12921298
} while ( true );
12931299
}
12941300

1295-
date = this._daylightSavingAdjust( new Date( year, month - 1, day ) );
1301+
date = this._daylightSavingAdjust( this._newDate( year, month - 1, day ) );
12961302
if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {
12971303
throw "Invalid date"; // E.g. 31/02/00
12981304
}

0 commit comments

Comments
 (0)