From: Iskren Chernev Date: Tue, 27 Oct 2015 05:36:08 +0000 (-0700) Subject: Add week overflow checks on creation X-Git-Tag: 2.11.0~65^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=331fb9c1f9abd4e808e702378b7496e935020994;p=thirdparty%2Fmoment.git Add week overflow checks on creation Fixes half of #2457 --- diff --git a/src/lib/create/check-overflow.js b/src/lib/create/check-overflow.js index 88a62ae54..f76d907aa 100644 --- a/src/lib/create/check-overflow.js +++ b/src/lib/create/check-overflow.js @@ -1,5 +1,5 @@ import { daysInMonth } from '../units/month'; -import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants'; +import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND, WEEK } from '../units/constants'; import getParsingFlags from '../create/parsing-flags'; export default function checkOverflow (m) { @@ -19,6 +19,9 @@ export default function checkOverflow (m) { if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } getParsingFlags(m).overflow = overflow; } diff --git a/src/lib/create/from-array.js b/src/lib/create/from-array.js index c4239cb72..51bddc6a6 100644 --- a/src/lib/create/from-array.js +++ b/src/lib/create/from-array.js @@ -1,6 +1,7 @@ import { createDate, createUTCDate } from './date-from-array'; import { daysInYear } from '../units/year'; import { weekOfYear } from '../units/week'; +import { weeksInYear } from '../units/week-year'; import { dayOfYearFromWeeks } from '../units/day-of-year'; import { YEAR, MONTH, DATE, HOUR, MINUTE, SECOND, MILLISECOND } from '../units/constants'; import { createLocal } from './local'; @@ -117,8 +118,11 @@ function dayOfYearFromWeekInfo(config) { weekday = dow; } } - temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); - - config._a[YEAR] = temp.year; - config._dayOfYear = temp.dayOfYear; + if (1 <= week && week <= weeksInYear(weekYear, dow, doy)) { + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } else { + getParsingFlags(config)._overflowWeeks = true; + } } diff --git a/src/lib/units/constants.js b/src/lib/units/constants.js index 588e70db5..0a11938be 100644 --- a/src/lib/units/constants.js +++ b/src/lib/units/constants.js @@ -5,3 +5,4 @@ export var HOUR = 3; export var MINUTE = 4; export var SECOND = 5; export var MILLISECOND = 6; +export var WEEK = 7; diff --git a/src/lib/units/week-year.js b/src/lib/units/week-year.js index 8ecfce754..6fd48b7a2 100644 --- a/src/lib/units/week-year.js +++ b/src/lib/units/week-year.js @@ -52,7 +52,7 @@ addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { // HELPERS -function weeksInYear(year, dow, doy) { +export function weeksInYear(year, dow, doy) { return weekOfYear(createLocal([year, 11, 31 + dow - doy]), dow, doy).week; } diff --git a/src/test/moment/week_year.js b/src/test/moment/week_year.js index aea60d7d8..c27dd78f5 100644 --- a/src/test/moment/week_year.js +++ b/src/test/moment/week_year.js @@ -96,3 +96,8 @@ test('week year overflows', function (assert) { assert.equal('2005-01-01', moment.utc('2004-W53-6', moment.ISO_8601, true).format('YYYY-MM-DD'), '2004-W53-6 is 1st Jan 2005'); assert.equal('2007-12-31', moment.utc('2008-W01-1', moment.ISO_8601, true).format('YYYY-MM-DD'), '2008-W01-1 is 31st Dec 2007'); }); + +test('weeks overflow', function (assert) { + assert.equal(7, moment.utc('2004-W54-1', moment.ISO_8601, true).parsingFlags().overflow, '2004 has only 53 weeks'); + assert.equal(7, moment.utc('2004-W00-1', moment.ISO_8601, true).parsingFlags().overflow, 'there is no 0th week'); +});