]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Add week overflow checks on creation
authorIskren Chernev <iskren.chernev@gmail.com>
Tue, 27 Oct 2015 05:36:08 +0000 (22:36 -0700)
committerIskren Chernev <iskren.chernev@gmail.com>
Mon, 9 Nov 2015 02:53:13 +0000 (18:53 -0800)
Fixes half of #2457

src/lib/create/check-overflow.js
src/lib/create/from-array.js
src/lib/units/constants.js
src/lib/units/week-year.js
src/test/moment/week_year.js

index 88a62ae5479a38c813f39526f00a42b9aa49e908..f76d907aae7ef05a01df2422c272b7f5eb47f489 100644 (file)
@@ -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;
     }
index c4239cb720d123d743edbf1ca930a655c595cb4c..51bddc6a696c0ba429a669b317e6aa430561e0d9 100644 (file)
@@ -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;
+    }
 }
index 588e70db59722168d7488940d1f5bed515307710..0a11938be9e099478dd79cd41e3baae35576e463 100644 (file)
@@ -5,3 +5,4 @@ export var HOUR = 3;
 export var MINUTE = 4;
 export var SECOND = 5;
 export var MILLISECOND = 6;
+export var WEEK = 7;
index 8ecfce754994a749522ca665e04f5a98cfd35f16..6fd48b7a2bdaef4194174ce30aa1e32cbb547274 100644 (file)
@@ -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;
 }
 
index aea60d7d826c4c69b9856f74f6355eb3ae3b91df..c27dd78f54e35394dbe11b171f216d26bee986c1 100644 (file)
@@ -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');
+});