From: Matt Johnson Date: Sat, 12 Mar 2016 20:09:17 +0000 (-0700) Subject: Setting year should keep time when offset changes X-Git-Tag: 2.13.0~22^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09397bc13cc280462389b64dac05ab39049be73c;p=thirdparty%2Fmoment.git Setting year should keep time when offset changes --- diff --git a/src/lib/units/year.js b/src/lib/units/year.js index a09e5e3ac..b86df29be 100644 --- a/src/lib/units/year.js +++ b/src/lib/units/year.js @@ -63,7 +63,7 @@ hooks.parseTwoDigitYear = function (input) { // MOMENTS -export var getSetYear = makeGetSet('FullYear', false); +export var getSetYear = makeGetSet('FullYear', true); export function getIsLeapYear () { return isLeapYear(this.year()); diff --git a/src/test/moment/getters_setters.js b/src/test/moment/getters_setters.js index 6f7b5216d..8f23e6882 100644 --- a/src/test/moment/getters_setters.js +++ b/src/test/moment/getters_setters.js @@ -251,3 +251,69 @@ test('string setters', function (assert) { assert.equal(a.seconds(), 8, 'second'); assert.equal(a.milliseconds(), 9, 'milliseconds'); }); + +test('setters across DST +1', function (assert) { + var oldUpdateOffset = moment.updateOffset, + // Based on a real story somewhere in America/Los_Angeles + dstAt = moment('2014-03-09T02:00:00-08:00').parseZone(), + m; + + moment.updateOffset = function (mom, keepTime) { + if (mom.isBefore(dstAt)) { + mom.utcOffset(-8, keepTime); + } else { + mom.utcOffset(-7, keepTime); + } + }; + + m = moment('2014-03-15T00:00:00-07:00').parseZone(); + m.year(2013); + assert.equal(m.format(), '2013-03-15T00:00:00-08:00', 'year across +1'); + + m = moment('2014-03-15T00:00:00-07:00').parseZone(); + m.month(0); + assert.equal(m.format(), '2014-01-15T00:00:00-08:00', 'month across +1'); + + m = moment('2014-03-15T00:00:00-07:00').parseZone(); + m.date(1); + assert.equal(m.format(), '2014-03-01T00:00:00-08:00', 'date across +1'); + + m = moment('2014-03-09T03:05:00-07:00').parseZone(); + m.hour(0); + assert.equal(m.format(), '2014-03-09T00:05:00-08:00', 'hour across +1'); + + moment.updateOffset = oldUpdateOffset; +}); + +test('setters across DST -1', function (assert) { + var oldUpdateOffset = moment.updateOffset, + // Based on a real story somewhere in America/Los_Angeles + dstAt = moment('2014-11-02T02:00:00-07:00').parseZone(), + m; + + moment.updateOffset = function (mom, keepTime) { + if (mom.isBefore(dstAt)) { + mom.utcOffset(-7, keepTime); + } else { + mom.utcOffset(-8, keepTime); + } + }; + + m = moment('2014-11-15T00:00:00-08:00').parseZone(); + m.year(2013); + assert.equal(m.format(), '2013-11-15T00:00:00-07:00', 'year across -1'); + + m = moment('2014-11-15T00:00:00-08:00').parseZone(); + m.month(0); + assert.equal(m.format(), '2014-01-15T00:00:00-07:00', 'month across -1'); + + m = moment('2014-11-15T00:00:00-08:00').parseZone(); + m.date(1); + assert.equal(m.format(), '2014-11-01T00:00:00-07:00', 'date across -1'); + + m = moment('2014-11-02T03:30:00-08:00').parseZone(); + m.hour(0); + assert.equal(m.format(), '2014-11-02T00:30:00-07:00', 'hour across -1'); + + moment.updateOffset = oldUpdateOffset; +}); diff --git a/src/test/moment/start_end_of.js b/src/test/moment/start_end_of.js index 8773d1bf4..dac79b750 100644 --- a/src/test/moment/start_end_of.js +++ b/src/test/moment/start_end_of.js @@ -293,6 +293,10 @@ test('startOf across DST +1', function (assert) { } }; + m = moment('2014-03-15T00:00:00-07:00').parseZone(); + m.startOf('y'); + assert.equal(m.format(), '2014-01-01T00:00:00-08:00', 'startOf(\'year\') across +1'); + m = moment('2014-03-15T00:00:00-07:00').parseZone(); m.startOf('M'); assert.equal(m.format(), '2014-03-01T00:00:00-08:00', 'startOf(\'month\') across +1'); @@ -328,6 +332,10 @@ test('startOf across DST -1', function (assert) { } }; + m = moment('2014-11-15T00:00:00-08:00').parseZone(); + m.startOf('y'); + assert.equal(m.format(), '2014-01-01T00:00:00-07:00', 'startOf(\'year\') across -1'); + m = moment('2014-11-15T00:00:00-08:00').parseZone(); m.startOf('M'); assert.equal(m.format(), '2014-11-01T00:00:00-07:00', 'startOf(\'month\') across -1');