From 95aeb62816dd970bb323106544c96522905eb1d7 Mon Sep 17 00:00:00 2001 From: Iskren Chernev Date: Tue, 14 Jan 2014 09:44:13 -0800 Subject: [PATCH] Improve non-padded strict tokens --- moment.js | 13 ++++++++++--- test/moment/create.js | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/moment.js b/moment.js index 438533c38..8a322e4b8 100644 --- a/moment.js +++ b/moment.js @@ -58,7 +58,8 @@ parseTokenTwoDigits = /\d\d/, // 00 - 99 parseTokenThreeDigits = /\d{3}/, // 000 - 999 parseTokenFourDigits = /\d{4}/, // 0000 - 9999 - parseTokenSixDigits = /[+\-]?\d{6}/, // -999,999 - 999,999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) @@ -930,6 +931,10 @@ case 'GGGG': case 'gggg': return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; case 'YYYYYY': case 'YYYYY': case 'GGGGG': @@ -942,8 +947,10 @@ if (strict) { return parseTokenTwoDigits; } /* falls through */ case 'SSS': + if (strict) { return parseTokenThreeDigits; } + /* falls through */ case 'DDD': - return strict ? parseTokenThreeDigits : parseTokenOneToThreeDigits; + return parseTokenOneToThreeDigits; case 'MMM': case 'MMMM': case 'dd': @@ -985,7 +992,7 @@ case 'W': case 'e': case 'E': - return strict ? parseTokenOneDigit : parseTokenOneOrTwoDigits; + return parseTokenOneOrTwoDigits; default : a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i")); return a; diff --git a/test/moment/create.js b/test/moment/create.js index 6baf65f7b..9219ca9d4 100644 --- a/test/moment/create.js +++ b/test/moment/create.js @@ -646,16 +646,30 @@ exports.create = { test.equal(moment(".*2010.*", ".*YYYY.*", true).year(), 2010, "valid format with regex chars on both sides"); //strict tokens + test.equal(moment("-5-05-25", 'YYYY-MM-DD', true).isValid(), false, "invalid negative year"); test.equal(moment("2-05-25", 'YYYY-MM-DD', true).isValid(), false, "invalid one-digit year"); test.equal(moment("20-05-25", 'YYYY-MM-DD', true).isValid(), false, "invalid two-digit year"); test.equal(moment("201-05-25", 'YYYY-MM-DD', true).isValid(), false, "invalid three-digit year"); + test.equal(moment("2010-05-25", 'YYYY-MM-DD', true).isValid(), true, "valid four-digit year"); + test.equal(moment("22010-05-25", 'YYYY-MM-DD', true).isValid(), false, "invalid five-digit year"); test.equal(moment("12-05-25", 'YY-MM-DD', true).isValid(), true, "valid two-digit year"); test.equal(moment("2012-05-25", 'YY-MM-DD', true).isValid(), false, "invalid four-digit year"); + test.equal(moment("-5-05-25", 'Y-MM-DD', true).isValid(), true, "valid negative year"); + test.equal(moment("2-05-25", 'Y-MM-DD', true).isValid(), true, "valid one-digit year"); + test.equal(moment("20-05-25", 'Y-MM-DD', true).isValid(), true, "valid two-digit year"); + test.equal(moment("201-05-25", 'Y-MM-DD', true).isValid(), true, "valid three-digit year"); + + test.equal(moment("2012-5-25", 'YYYY-M-DD', true).isValid(), true, "valid one-digit month"); test.equal(moment("2012-5-25", 'YYYY-MM-DD', true).isValid(), false, "invalid one-digit month"); + test.equal(moment("2012-05-25", 'YYYY-M-DD', true).isValid(), true, "valid one-digit month"); + test.equal(moment("2012-05-25", 'YYYY-MM-DD', true).isValid(), true, "valid one-digit month"); + test.equal(moment("2012-05-2", 'YYYY-MM-D', true).isValid(), true, "valid one-digit day"); test.equal(moment("2012-05-2", 'YYYY-MM-DD', true).isValid(), false, "invalid one-digit day"); + test.equal(moment("2012-05-02", 'YYYY-MM-D', true).isValid(), true, "valid two-digit day"); + test.equal(moment("2012-05-02", 'YYYY-MM-DD', true).isValid(), true, "valid two-digit day"); test.equal(moment("+002012-05-25", 'YYYYY-MM-DD', true).isValid(), true, "valid six-digit year"); test.equal(moment("+2012-05-25", 'YYYYY-MM-DD', true).isValid(), false, "invalid four-digit year"); -- 2.47.2