From: Iskren Chernev Date: Tue, 27 Oct 2015 05:08:07 +0000 (-0700) Subject: Fix moment creation from week-calendar when year didn't match week year X-Git-Tag: 2.11.0~65^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=87b0ae197a951caff4b0d61b7390a9029e82fc18;p=thirdparty%2Fmoment.git Fix moment creation from week-calendar when year didn't match week year --- diff --git a/src/lib/units/day-of-year.js b/src/lib/units/day-of-year.js index 0c34fa395..fcd1ee003 100644 --- a/src/lib/units/day-of-year.js +++ b/src/lib/units/day-of-year.js @@ -26,7 +26,7 @@ addParseToken(['DDD', 'DDDD'], function (input, array, config) { //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday export function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var week1Jan = 6 + firstDayOfWeek - firstDayOfWeekOfYear, janX = createUTCDate(year, 0, 1 + week1Jan), d = janX.getUTCDay(), dayOfYear; + var week1Jan = 6 + firstDayOfWeek - firstDayOfWeekOfYear, janX = createUTCDate(year, 0, 1 + week1Jan), d = janX.getUTCDay(), dayOfYear, resYear, resDayOfYear; if (d < firstDayOfWeek) { d += 7; } @@ -35,9 +35,20 @@ export function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, fi dayOfYear = 1 + week1Jan + 7 * (week - 1) - d + weekday; + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + return { - year: dayOfYear > 0 ? year : year - 1, - dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + year: resYear, + dayOfYear: resDayOfYear }; } diff --git a/src/test/moment/week_year.js b/src/test/moment/week_year.js index 340d0ffe6..aea60d7d8 100644 --- a/src/test/moment/week_year.js +++ b/src/test/moment/week_year.js @@ -91,3 +91,8 @@ test('week numbers 2012/2013', function (assert) { assert.equal(3, moment('2013-01-12', 'YYYY-MM-DD').week()); // 1 -- should be 3 assert.equal(52, moment().weeksInYear(2012)); // 52 }); + +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'); +});