]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
Fix (iso)weekYear setter
authorIskren Chernev <iskren.chernev@gmail.com>
Tue, 27 Oct 2015 07:55:09 +0000 (00:55 -0700)
committerIskren Chernev <iskren.chernev@gmail.com>
Mon, 9 Nov 2015 02:53:13 +0000 (18:53 -0800)
Fixes #2033 #1379

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

index 6fd48b7a2bdaef4194174ce30aa1e32cbb547274..c9a974c337c0b2434fba2de53d296c29c0a833ab 100644 (file)
@@ -6,6 +6,8 @@ import { weekOfYear } from './week';
 import toInt from '../utils/to-int';
 import { hooks } from '../utils/hooks';
 import { createLocal } from '../create/local';
+import { dayOfYearFromWeeks } from './day-of-year';
+import { createUTCDate } from '../create/date-from-array';
 
 // FORMATTING
 
@@ -59,13 +61,17 @@ export function weeksInYear(year, dow, doy) {
 // MOMENTS
 
 export function getSetWeekYear (input) {
-    var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
-    return input == null ? year : this.add((input - year), 'y');
+    return getSetWeekYearHelper.call(this,
+            input,
+            this.week(),
+            this.weekday(),
+            this.localeData()._week.dow,
+            this.localeData()._week.doy);
 }
 
 export function getSetISOWeekYear (input) {
-    var year = weekOfYear(this, 1, 4).year;
-    return input == null ? year : this.add((input - year), 'y');
+    return getSetWeekYearHelper.call(this,
+            input, this.isoWeek(), this.isoWeekday(), 1, 4);
 }
 
 export function getISOWeeksInYear () {
@@ -76,3 +82,27 @@ export function getWeeksInYear () {
     var weekInfo = this.localeData()._week;
     return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
 }
+
+function getSetWeekYearHelper(input, week, weekday, dow, doy) {
+    var weeksTarget;
+    if (input == null) {
+        return weekOfYear(this, dow, doy).year;
+    } else {
+        weeksTarget = weeksInYear(input, dow, doy);
+        if (week > weeksTarget) {
+            week = weeksTarget;
+        }
+        return setWeekAll.call(this, input, week, weekday, dow, doy);
+    }
+}
+
+function setWeekAll(weekYear, week, weekday, dow, doy) {
+    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow),
+        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
+
+    // console.log("got", weekYear, week, weekday, "set", date.toISOString());
+    this.year(date.getUTCFullYear());
+    this.month(date.getUTCMonth());
+    this.date(date.getUTCDate());
+    return this;
+}
index c27dd78f54e35394dbe11b171f216d26bee986c1..0c2ac6078b1f295f26c632edb1c9db990e84e9ab 100644 (file)
@@ -101,3 +101,20 @@ 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');
 });
+
+test('week year setter works', function (assert) {
+    for (var year = 2000; year <= 2020; year += 1) {
+        assert.equal(moment.utc('2012-12-31T00:00:00.000Z').isoWeekYear(year).isoWeekYear(), year, 'setting iso-week-year to ' + year);
+        assert.equal(moment.utc('2012-12-31T00:00:00.000Z').weekYear(year).weekYear(), year, 'setting week-year to ' + year);
+    }
+
+    assert.equal(moment.utc('2004-W53-1', moment.ISO_8601, true).isoWeekYear(2013).format('GGGG-[W]WW-E'), '2013-W52-1', '2004-W53-1 to 2013');
+    assert.equal(moment.utc('2004-W53-1', moment.ISO_8601, true).isoWeekYear(2020).format('GGGG-[W]WW-E'), '2020-W53-1', '2004-W53-1 to 2020');
+    assert.equal(moment.utc('2005-W52-1', moment.ISO_8601, true).isoWeekYear(2004).format('GGGG-[W]WW-E'), '2004-W52-1', '2005-W52-1 to 2004');
+    assert.equal(moment.utc('2013-W30-4', moment.ISO_8601, true).isoWeekYear(2015).format('GGGG-[W]WW-E'), '2015-W30-4', '2013-W30-4 to 2015');
+
+    assert.equal(moment.utc('2005-w53-0', 'gggg-[w]ww-e', true).weekYear(2013).format('gggg-[w]ww-e'), '2013-w52-0', '2005-w53-0 to 2013');
+    assert.equal(moment.utc('2005-w53-0', 'gggg-[w]ww-e', true).weekYear(2016).format('gggg-[w]ww-e'), '2016-w53-0', '2005-w53-0 to 2016');
+    assert.equal(moment.utc('2004-w52-0', 'gggg-[w]ww-e', true).weekYear(2005).format('gggg-[w]ww-e'), '2005-w52-0', '2004-w52-0 to 2005');
+    assert.equal(moment.utc('2013-w30-4', 'gggg-[w]ww-e', true).weekYear(2015).format('gggg-[w]ww-e'), '2015-w30-4', '2013-w30-4 to 2015');
+});