// 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);
}
}
['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();
},
//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');
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();
}
};