]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Fix moment creation from week-calendar when year didn't match week year
authorIskren Chernev <iskren.chernev@gmail.com>
Tue, 27 Oct 2015 05:08:07 +0000 (22:08 -0700)
committerIskren Chernev <iskren.chernev@gmail.com>
Mon, 9 Nov 2015 02:53:13 +0000 (18:53 -0800)
src/lib/units/day-of-year.js
src/test/moment/week_year.js

index 0c34fa3956e2ff102e6fbd0571d2ea904fc03428..fcd1ee0033fd17bb18ca66889e8db19ce551adc9 100644 (file)
@@ -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
     };
 }
 
index 340d0ffe6d30c77982e52887b21013f30e048290..aea60d7d826c4c69b9856f74f6355eb3ae3b91df 100644 (file)
@@ -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');
+});