]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
[bugfix] Use ISO Year for weeksInISOYear instead of calendar year. (#4410)
authorAlex Mitchell <alex+github@alexmitchelltech.com>
Sat, 25 Apr 2020 22:30:25 +0000 (17:30 -0500)
committerGitHub <noreply@github.com>
Sat, 25 Apr 2020 22:30:25 +0000 (01:30 +0300)
* Use calendar year of day at end of week for ISO year week count

* Fix ambiguously constructed test moments

* Add some spacing

src/lib/units/week-year.js
src/test/moment/weeks_in_year.js

index d7edd05481ce0c2637d2a38beeabef056d2d125e..4aa3f6a59ba6b290bfb6b509407f440ce86619d2 100644 (file)
@@ -8,6 +8,10 @@ import toInt from '../utils/to-int';
 import { hooks } from '../utils/hooks';
 import { createUTCDate } from '../create/date-from-array';
 
+// CONSTANTS
+
+const THURSDAY = 4;
+
 // FORMATTING
 
 addFormatToken(0, ['gg', 2], 0, function () {
@@ -74,7 +78,7 @@ export function getSetISOWeekYear (input) {
 }
 
 export function getISOWeeksInYear () {
-    return weeksInYear(this.year(), 1, 4);
+    return weeksInYear(this.isoWeekday(THURSDAY).year(), 1, 4);
 }
 
 export function getWeeksInYear () {
index 8f2c8167f3e63da0ebabb1f6de2a08421c9f885e..f60378715b15c36a56942309386647e0cf884623 100644 (file)
@@ -3,19 +3,24 @@ import moment from '../../moment';
 
 module('weeks in year');
 
-test('isoWeeksInYear', function (assert) {
-    assert.equal(moment([2004]).isoWeeksInYear(), 53, '2004 has 53 iso weeks');
-    assert.equal(moment([2005]).isoWeeksInYear(), 52, '2005 has 53 iso weeks');
-    assert.equal(moment([2006]).isoWeeksInYear(), 52, '2006 has 53 iso weeks');
-    assert.equal(moment([2007]).isoWeeksInYear(), 52, '2007 has 52 iso weeks');
-    assert.equal(moment([2008]).isoWeeksInYear(), 52, '2008 has 53 iso weeks');
-    assert.equal(moment([2009]).isoWeeksInYear(), 53, '2009 has 53 iso weeks');
-    assert.equal(moment([2010]).isoWeeksInYear(), 52, '2010 has 52 iso weeks');
-    assert.equal(moment([2011]).isoWeeksInYear(), 52, '2011 has 52 iso weeks');
-    assert.equal(moment([2012]).isoWeeksInYear(), 52, '2012 has 52 iso weeks');
-    assert.equal(moment([2013]).isoWeeksInYear(), 52, '2013 has 52 iso weeks');
-    assert.equal(moment([2014]).isoWeeksInYear(), 52, '2014 has 52 iso weeks');
-    assert.equal(moment([2015]).isoWeeksInYear(), 53, '2015 has 53 iso weeks');
+test('isoWeeksInYear first day of ISO Year', function (assert) {
+    assert.equal(moment('2003-12-29').isoWeeksInYear(), 53, 'ISO year 2004 has 53 iso weeks');
+    assert.equal(moment('2005-01-03').isoWeeksInYear(), 52, 'ISO year 2005 has 53 iso weeks');
+    assert.equal(moment('2006-01-02').isoWeeksInYear(), 52, 'ISO year 2006 has 53 iso weeks');
+    assert.equal(moment('2007-01-01').isoWeeksInYear(), 52, 'ISO year 2007 has 52 iso weeks');
+    assert.equal(moment('2007-12-31').isoWeeksInYear(), 52, 'ISO year 2008 has 53 iso weeks');
+    assert.equal(moment('2008-12-29').isoWeeksInYear(), 53, 'ISO year 2009 has 53 iso weeks');
+    assert.equal(moment('2010-01-04').isoWeeksInYear(), 52, 'ISO year 2010 has 52 iso weeks');
+    assert.equal(moment('2011-01-03').isoWeeksInYear(), 52, 'ISO year 2011 has 52 iso weeks');
+    assert.equal(moment('2012-01-02').isoWeeksInYear(), 52, 'ISO year 2012 has 52 iso weeks');
+    assert.equal(moment('2012-12-31').isoWeeksInYear(), 52, 'ISO year 2013 has 52 iso weeks');
+    assert.equal(moment('2013-12-30').isoWeeksInYear(), 52, 'ISO year 2014 has 52 iso weeks');
+    assert.equal(moment('2014-12-29').isoWeeksInYear(), 53, 'ISO year 2015 has 53 iso weeks');
+    assert.equal(moment('2016-01-04').isoWeeksInYear(), 52, 'ISO year 2016 has 52 iso weeks');
+    assert.equal(moment('2017-01-02').isoWeeksInYear(), 52, 'ISO year 2017 has 52 iso weeks');
+    assert.equal(moment('2018-01-01').isoWeeksInYear(), 52, 'ISO year 2018 has 52 iso weeks');
+    assert.equal(moment('2018-12-31').isoWeeksInYear(), 52, 'ISO year 2019 has 52 iso weeks');
+    assert.equal(moment('2019-12-30').isoWeeksInYear(), 53, 'ISO year 2020 has 53 iso weeks');
 });
 
 test('weeksInYear doy/dow = 1/4', function (assert) {
@@ -85,3 +90,9 @@ test('weeksInYear doy/dow = 0/6', function (assert) {
     assert.equal(moment([2014]).weeksInYear(), 52, '2014 has 52 weeks');
     assert.equal(moment([2015]).weeksInYear(), 52, '2015 has 53 weeks');
 });
+
+test('isoWeeksInYear calendar year !== ISO year', function (assert) {
+    assert.equal(moment('2019-12-31').isoWeeksInYear(), 53, 'December 31, 2019 is in ISO year 2020 and ISO year 2020 has 53 weeks');
+    assert.equal(moment('2020-12-31').isoWeeksInYear(), 53, 'December 31, 2020 is in ISO year 2020 and ISO year 2020 has 53 weeks');
+});
+