From: Petr Potekhin Date: Thu, 20 Jul 2017 20:27:50 +0000 (+0300) Subject: Fix #3985 code review changes X-Git-Tag: 2.19.0~22^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c293d4bcb209bda2b4b8c826d09333e389ffd43c;p=thirdparty%2Fmoment.git Fix #3985 code review changes --- diff --git a/src/lib/create/from-string.js b/src/lib/create/from-string.js index 6f7af0cc2..d7081e085 100644 --- a/src/lib/create/from-string.js +++ b/src/lib/create/from-string.js @@ -100,23 +100,29 @@ export function configFromISO(config) { var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/; function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { - var result = { - year: yearStr.length === 2 ? untrucateYear(parse10(yearStr)) : parse10(yearStr), - month: defaultLocaleMonthsShort.indexOf(monthStr), - day: parse10(dayStr), - hour: parse10(hourStr), - minute: parse10(minuteStr) - }; + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; if (secondStr) { - result.second = parse10(secondStr); + result.push(parseInt(secondStr, 10)); } return result; } -function untrucateYear(year) { - return year > 60 ? 1900 + year : 2000 + year; +function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; } function preprocessRFC2822(s) { @@ -125,8 +131,8 @@ function preprocessRFC2822(s) { } function signedOffset(offHourStr, offMinuteStr) { - var offHour = parse10(offHourStr) || 0, - offMin = parse10(offMinuteStr) || 0, + var offHour = parseInt(offHourStr, 10) || 0, + offMin = parseInt(offMinuteStr, 10) || 0, offMinSigned = offHour < 0 ? -offMin : offMin; return offHour * 60 + offMinSigned; } @@ -135,7 +141,7 @@ function checkWeekday(weekdayStr, parsedInput, config) { if (weekdayStr) { // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), - weekdayActual = new Date(parsedInput.year, parsedInput.month, parsedInput.day).getDay(); + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); if (weekdayProvided !== weekdayActual) { getParsingFlags(config).weekdayMismatch = true; config._isValid = false; @@ -157,10 +163,6 @@ var obsOffsets = { PST: 8 * 60 }; -function parse10(inty) { - return parseInt(inty, 10); -} - function calculateOffset(obsOffset, milOffset, offHourStr, offMinuteStr) { if (obsOffset) { return obsOffsets[obsOffset]; @@ -178,7 +180,7 @@ export function configFromRFC2822(config) { return; } - config._a = [parsedArray.year, parsedArray.month, parsedArray.day, parsedArray.hour, parsedArray.minute, parsedArray.second]; + config._a = parsedArray; config._tzm = calculateOffset(match[8], match[9], match[10], match[11]); configFromArray(config); diff --git a/src/test/locale/ru.js b/src/test/locale/ru.js index 0ea1d74ff..8568853a7 100644 --- a/src/test/locale/ru.js +++ b/src/test/locale/ru.js @@ -352,36 +352,3 @@ test('weeks year starting monday formatted', function (assert) { assert.equal(moment([2012, 0, 8]).format('w ww wo'), '1 01 1-я', 'Jan 8 2012 should be week 1'); assert.equal(moment([2012, 0, 9]).format('w ww wo'), '2 02 2-я', 'Jan 9 2012 should be week 2'); }); - -test('parsing RFC 2822', function (assert) { - var testCases = { - 'clean RFC2822 datetime with all options': 'Tue, 01 Nov 2016 01:23:45 UT', - 'clean RFC2822 datetime without comma': 'Tue 01 Nov 2016 02:23:45 GMT', - 'clean RFC2822 datetime without seconds': 'Tue, 01 Nov 2016 03:23 +0000', - 'clean RFC2822 datetime without century': 'Tue, 01 Nov 16 04:23:45 Z', - 'clean RFC2822 datetime without day': '01 Nov 2016 05:23:45 z', - 'clean RFC2822 datetime with single-digit day-of-month': 'Tue, 1 Nov 2016 06:23:45 GMT', - 'RFC2822 datetime with CFWSs': '(Init Comment) Tue,\n 1 Nov 2016 (Split\n Comment) 07:23:45 +0000 (GMT)' - }; - var testCase; - - for (testCase in testCases) { - var testResult = moment(testCases[testCase], moment.RFC_2822, true); - assert.ok(testResult.isValid(), testResult); - assert.ok(testResult.parsingFlags().rfc2822, testResult + ' - rfc2822 parsingFlag'); - } -}); - -test('non RFC 2822 strings', function (assert) { - var testCases = { - 'RFC2822 datetime with all options but invalid day delimiter': 'Tue. 01 Nov 2016 01:23:45 GMT', - 'RFC2822 datetime with mismatching Day (week v date)': 'Mon, 01 Nov 2016 01:23:45 GMT' - }; - var testCase; - - for (testCase in testCases) { - var testResult = moment(testCases[testCase], moment.RFC_2822, true); - assert.ok(!testResult.isValid(), testResult); - assert.ok(!testResult.parsingFlags().rfc2822, testResult + ' - rfc2822 parsingFlag'); - } -}); diff --git a/src/test/moment/create.js b/src/test/moment/create.js index 4b8a277bc..9ad565131 100644 --- a/src/test/moment/create.js +++ b/src/test/moment/create.js @@ -489,6 +489,51 @@ test('non RFC 2822 strings', function (assert) { } }); +test('parsing RFC 2822 in a different locale', function (assert) { + var testCases = { + 'clean RFC2822 datetime with all options': 'Tue, 01 Nov 2016 01:23:45 UT', + 'clean RFC2822 datetime without comma': 'Tue 01 Nov 2016 02:23:45 GMT', + 'clean RFC2822 datetime without seconds': 'Tue, 01 Nov 2016 03:23 +0000', + 'clean RFC2822 datetime without century': 'Tue, 01 Nov 16 04:23:45 Z', + 'clean RFC2822 datetime without day': '01 Nov 2016 05:23:45 z', + 'clean RFC2822 datetime with single-digit day-of-month': 'Tue, 1 Nov 2016 06:23:45 GMT', + 'RFC2822 datetime with CFWSs': '(Init Comment) Tue,\n 1 Nov 2016 (Split\n Comment) 07:23:45 +0000 (GMT)' + }; + var testCase; + + try { + moment.locale('ru'); + for (testCase in testCases) { + var testResult = moment(testCases[testCase], moment.RFC_2822, true); + assert.ok(testResult.isValid(), testResult); + assert.ok(testResult.parsingFlags().rfc2822, testResult + ' - rfc2822 parsingFlag'); + } + } + finally { + moment.locale('en'); + } +}); + +test('non RFC 2822 strings in a different locale', function (assert) { + var testCases = { + 'RFC2822 datetime with all options but invalid day delimiter': 'Tue. 01 Nov 2016 01:23:45 GMT', + 'RFC2822 datetime with mismatching Day (week v date)': 'Mon, 01 Nov 2016 01:23:45 GMT' + }; + var testCase; + + try { + moment.locale('ru'); + for (testCase in testCases) { + var testResult = moment(testCases[testCase], moment.RFC_2822, true); + assert.ok(!testResult.isValid(), testResult); + assert.ok(!testResult.parsingFlags().rfc2822, testResult + ' - rfc2822 parsingFlag'); + } + } + finally { + moment.locale('en'); + } +}); + test('parsing iso', function (assert) { var offset = moment([2011, 9, 8]).utcOffset(), pad = function (input) {