]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
make the iso parser work with the week and ordinal formats
authorIsaac Cambron <isaac@isaaccambron.com>
Fri, 4 Oct 2013 09:03:33 +0000 (05:03 -0400)
committerIsaac Cambron <isaac@isaaccambron.com>
Fri, 4 Oct 2013 09:03:33 +0000 (05:03 -0400)
moment.js
test/moment/create.js

index 263e22914a86019a6c95993d9c734fd5de7c4408..c5ce6cb76941039a449adfb88b263f71979b62cd 100644 (file)
--- a/moment.js
+++ b/moment.js
@@ -35,7 +35,6 @@
 
         // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
         // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
-        // isoDurationRegex = /^(-)?(?:P)(?:(\d+(?:[,.]\d+)?)Y)?(?:(\d+(?:[,.]\d+)?)M)?(?:(\d+(?:[,.]\d+)?)W)?(?:(\d+(?:[,.]\d+)?)D)?(T(?:(\d+(?:[,.]\d+)?)H)?(?:(\d+(?:[,.]\d+)?)M)?(?:(\d+(?:[,.]\d+)?)S)?)?$/,
         isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
 
         // format tokens
         parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
 
         // preliminary iso regex
-        // 0000-00-00 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000
-        isoRegex = /^\s*\d{4}-\d\d-\d\d((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?$/,
+        // 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)
+        isoRegex = /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?$/,
+
         isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
 
+        isoDates = [
+           'YYYY-MM-DD',
+           'GGGG-[W]WW',
+           'GGGG-[W]WW-E',
+           'YYYY-DDD'
+        ],
+
         // iso time formats and regexes
         isoTimes = [
             ['HH:mm:ss.S', /(T| )\d\d:\d\d:\d\d\.\d{1,3}/],
         case 'W':
         case 'WW':
         case 'e':
-        case 'ee':
         case 'E':
-        case 'EE':
             return parseTokenOneOrTwoDigits;
         default :
             a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i"));
 
     // function to convert string input to date
     function addTimeToArrayFromToken(token, input, config) {
-        var a, datePartArray = config._a;
+        var a, datePartArray = config._a, weekProp;
 
         switch (token) {
         // MONTH
             match = isoRegex.exec(string);
 
         if (match) {
-            // match[2] should be "T" or undefined
-            config._f = 'YYYY-MM-DD' + (match[2] || " ");
+            for (i = 4; i > 0; i--) {
+                if (match[i]) {
+                    // match[5] should be "T" or undefined
+                    config._f = isoDates[i - 1] + (match[6] || " ");
+                    break;
+                }
+            }
             for (i = 0; i < 4; i++) {
                 if (isoTimes[i][1].exec(string)) {
                     config._f += isoTimes[i][0];
                 config._f += " Z";
             }
             makeDateFromStringAndFormat(config);
-        } else {
+        }
+        else {
             config._d = new Date(string);
         }
     }
index ba14f165589ac0829e03659ec93a99ccf9e20c19..5c157d8a918873a36dc663bc2a93b0aecfd86474 100644 (file)
@@ -414,11 +414,54 @@ exports.create = {
                 ['2011-10-08 18:04:20' + tz2,     '2011-10-08T18:04:20.000' + tz],
                 ['2011-10-08 18:04:20.1' + tz2,   '2011-10-08T18:04:20.100' + tz],
                 ['2011-10-08 18:04:20.11' + tz2,  '2011-10-08T18:04:20.110' + tz],
-                ['2011-10-08 18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz]
+                ['2011-10-08 18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+                ['2011-W40',                      '2011-10-03T00:00:00.000' + tz],
+                ['2011-W40-6',                    '2011-10-08T00:00:00.000' + tz],
+                ['2011-W40-6T18',                 '2011-10-08T18:00:00.000' + tz],
+                ['2011-W40-6T18:04',              '2011-10-08T18:04:00.000' + tz],
+                ['2011-W40-6T18:04:20',           '2011-10-08T18:04:20.000' + tz],
+                ['2011-W40-6T18:04' + tz,         '2011-10-08T18:04:00.000' + tz],
+                ['2011-W40-6T18:04:20' + tz,      '2011-10-08T18:04:20.000' + tz],
+                ['2011-W40-6T18:04' + tz2,        '2011-10-08T18:04:00.000' + tz],
+                ['2011-W40-6T18:04:20' + tz2,     '2011-10-08T18:04:20.000' + tz],
+                ['2011-W40-6T18:04:20.1' + tz2,   '2011-10-08T18:04:20.100' + tz],
+                ['2011-W40-6T18:04:20.11' + tz2,  '2011-10-08T18:04:20.110' + tz],
+                ['2011-W40-6T18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+                ['2011-W40-6 18',                 '2011-10-08T18:00:00.000' + tz],
+                ['2011-W40-6 18:04',              '2011-10-08T18:04:00.000' + tz],
+                ['2011-W40-6 18:04:20',           '2011-10-08T18:04:20.000' + tz],
+                ['2011-W40-6 18:04' + tz,         '2011-10-08T18:04:00.000' + tz],
+                ['2011-W40-6 18:04:20' + tz,      '2011-10-08T18:04:20.000' + tz],
+                ['2011-W40-6 18:04' + tz2,        '2011-10-08T18:04:00.000' + tz],
+                ['2011-W40-6 18:04:20' + tz2,     '2011-10-08T18:04:20.000' + tz],
+                ['2011-W40-6 18:04:20.1' + tz2,   '2011-10-08T18:04:20.100' + tz],
+                ['2011-W40-6 18:04:20.11' + tz2,  '2011-10-08T18:04:20.110' + tz],
+                ['2011-W40-6 18:04:20.111' + tz2, '2011-10-08T18:04:20.111' + tz],
+                ['2011-281',                      '2011-10-08T00:00:00.000' + tz],
+                ['2011-281T18',                   '2011-10-08T18:00:00.000' + tz],
+                ['2011-281T18:04',                '2011-10-08T18:04:00.000' + tz],
+                ['2011-281T18:04:20',             '2011-10-08T18:04:20.000' + tz],
+                ['2011-281T18:04' + tz,           '2011-10-08T18:04:00.000' + tz],
+                ['2011-281T18:04:20' + tz,        '2011-10-08T18:04:20.000' + tz],
+                ['2011-281T18:04' + tz2,          '2011-10-08T18:04:00.000' + tz],
+                ['2011-281T18:04:20' + tz2,       '2011-10-08T18:04:20.000' + tz],
+                ['2011-281T18:04:20.1' + tz2,     '2011-10-08T18:04:20.100' + tz],
+                ['2011-281T18:04:20.11' + tz2,    '2011-10-08T18:04:20.110' + tz],
+                ['2011-281T18:04:20.111' + tz2,   '2011-10-08T18:04:20.111' + tz],
+                ['2011-281 18',                   '2011-10-08T18:00:00.000' + tz],
+                ['2011-281 18:04',                '2011-10-08T18:04:00.000' + tz],
+                ['2011-281 18:04:20',             '2011-10-08T18:04:20.000' + tz],
+                ['2011-281 18:04' + tz,           '2011-10-08T18:04:00.000' + tz],
+                ['2011-281 18:04:20' + tz,        '2011-10-08T18:04:20.000' + tz],
+                ['2011-281 18:04' + tz2,          '2011-10-08T18:04:00.000' + tz],
+                ['2011-281 18:04:20' + tz2,       '2011-10-08T18:04:20.000' + tz],
+                ['2011-281 18:04:20.1' + tz2,     '2011-10-08T18:04:20.100' + tz],
+                ['2011-281 18:04:20.11' + tz2,    '2011-10-08T18:04:20.110' + tz],
+                ['2011-281 18:04:20.111' + tz2,   '2011-10-08T18:04:20.111' + tz]
             ], i;
         test.expect(formats.length);
         for (i = 0; i < formats.length; i++) {
-            test.equal(formats[i][1], moment(formats[i][0]).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), "moment should be able to parse ISO " + formats[i][0]);
+            test.equal(moment(formats[i][0]).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), formats[i][1], "moment should be able to parse ISO " + formats[i][0]);
         }
         test.done();
     },
@@ -574,9 +617,9 @@ exports.create = {
 
         //year + week + day
         test.equal(moment('1999 37 4', 'gggg ww e').format('YYYY MM DD'), "1999 09 09", 'day');
-        test.equal(moment('1999 37 4', 'gggg ww ee').format('YYYY MM DD'), "1999 09 09", 'day double');
+        test.equal(moment('1999 37 04', 'gggg ww e').format('YYYY MM DD'), "1999 09 09", 'day');
         test.equal(moment('1999 37 4', 'GGGG WW E').format('YYYY MM DD'), "1999 09 16", 'iso day');
-        test.equal(moment('1999 37 4', 'GGGG WW EE').format('YYYY MM DD'), "1999 09 16", 'iso day double');
+        test.equal(moment('1999 37 04', 'GGGG WW E').format('YYYY MM DD'), "1999 09 16", 'iso day');
 
         //d
         test.equal(moment('1999 37 4', 'gggg ww d').format('YYYY MM DD'), "1999 09 09", 'd');
@@ -597,6 +640,9 @@ exports.create = {
         test.equal(moment('6 2013 2', 'e gggg w').format('YYYY MM DD'), "2013 01 12", "order doesn't matter");
         test.equal(moment('6 2013 2', 'E GGGG W').format('YYYY MM DD'), "2013 01 12", "iso order doesn't matter");
 
+        //can parse other stuff too
+        test.equals(moment('1999-W37-4 3:30', 'GGGG-[W]WW-E HH:mm').format('YYYY MM DD HH:mm'), '1999 09 16 03:30', "parsing weeks and hours");
+
         test.done();
     }
 };