From a90601273f7dc985ee77594e8dfd77fa5a30ebd8 Mon Sep 17 00:00:00 2001 From: Tim Wood Date: Mon, 20 Feb 2012 12:40:31 -0800 Subject: [PATCH] Added automatic iso parsing #153 --- moment.js | 35 +++++++++++++++++++++++++++++------ test/moment/create.js | 29 +++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/moment.js b/moment.js index 989295a69..c868e5df8 100644 --- a/moment.js +++ b/moment.js @@ -18,7 +18,13 @@ timezoneRegex = /\([A-Za-z ]+\)|:[0-9]{2} [A-Z]{3} /g, tokenCharacters = /(\\)?(MM?M?M?|dd?d?d|DD?D?D?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|ZZ?|T)/g, inputCharacters = /(\\)?([0-9]+|([a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+|([\+\-]\d\d:?\d\d))/gi, + isoRegex = /\d{4}.\d\d.\d\d(T(\d\d(.\d\d(.\d\d)?)?)?([\+\-]\d\d:?\d\d)?)?/, isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + isoTimes = [ + ['HH:mm:ss', /T\d\d:\d\d:\d\d/], + ['HH:mm', /T\d\d:\d\d/], + ['HH', /T\d\d/] + ], timezoneParseRegex = /([\+\-]|\d\d)/gi, VERSION = "1.4.0", shortcuts = 'Month|Date|Hours|Minutes|Seconds|Milliseconds'.split('|'); @@ -214,6 +220,7 @@ isUsingUTC = false, inputParts = string.match(inputCharacters), formatParts = format.match(tokenCharacters), + len = Math.min(inputParts.length, formatParts.length), i, isPm; @@ -303,7 +310,7 @@ break; } } - for (i = 0; i < formatParts.length; i++) { + for (i = 0; i < len; i++) { addTime(formatParts[i], inputParts[i]); } // handle am pm @@ -355,6 +362,22 @@ return output; } + // date from iso format + function makeDateFromString(string) { + var format = 'YYYY-MM-DDT', + i; + if (isoRegex.exec(string)) { + for (i = 0; i < 3; i++) { + if (isoTimes[i][1].exec(string)) { + format += isoTimes[i][0]; + break; + } + } + return makeDateFromStringAndFormat(string, format + 'Z'); + } + return new Date(string); + } + moment = function (input, format) { if (input === null) { return null; @@ -378,6 +401,7 @@ matched ? new Date(+matched[1]) : input instanceof Date ? input : isArray(input) ? dateFromArray(input) : + typeof input === 'string' ? makeDateFromString(input) : new Date(input); } return new Moment(date); @@ -609,6 +633,10 @@ d : 1, ms : -1 }); + }, + + zone : function () { + return this._d.getTimezoneOffset(); } }; @@ -632,11 +660,6 @@ // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear') makeShortcut('year', 'FullYear'); - // add shortcut for timezone offset (no setter) - moment.fn.zone = function () { - return this._d.getTimezoneOffset(); - }; - // CommonJS module is defined if (hasModule) { module.exports = moment; diff --git a/test/moment/create.js b/test/moment/create.js index c8a0deb10..4d46f4d2c 100644 --- a/test/moment/create.js +++ b/test/moment/create.js @@ -151,4 +151,33 @@ exports.create = { test.equal(momentA.month(), 5, "Calling moment() on a moment will create a clone"); test.done(); }, + + "parsing iso" : function(test) { + var offset = moment([2011, 9, 08]).zone(); + var pad = function(input) { + if (input < 10) { + return '0' + input; + } + return '' + input; + } + var hourOffset = Math.floor(offset / 60); + var minOffset = offset - (hourOffset * 60); + var tz = (offset > 0) ? '-' + pad(hourOffset) + ':' + pad(minOffset) : '+' + pad(-hourOffset) + ':' + pad(-minOffset); + var tz2 = tz.replace(':', ''); + var formats = [ + ['2011-10-08', '2011-10-08T00:00:00' + tz], + ['2011-10-08T18', '2011-10-08T18:00:00' + tz], + ['2011-10-08T18:04', '2011-10-08T18:04:00' + tz], + ['2011-10-08T18:04:20', '2011-10-08T18:04:20' + tz], + ['2011-10-08T18:04' + tz, '2011-10-08T18:04:00' + tz], + ['2011-10-08T18:04:20' + tz, '2011-10-08T18:04:20' + tz], + ['2011-10-08T18:04' + tz2, '2011-10-08T18:04:00' + tz], + ['2011-10-08T18:04:20' + tz2, '2011-10-08T18:04:20' + tz], + ]; + test.expect(formats.length); + for (var i = 0; i < formats.length; i++) { + test.equal(moment(formats[i][0]).format('YYYY-MM-DDTHH:mm:ssZ'), formats[i][1], "moment should be able to parse ISO " + formats[i][0]); + } + test.done(); + } }; -- 2.47.3