diff --git a/src/plugin/utc/index.js b/src/plugin/utc/index.js index f1473570b..f569ccbbd 100644 --- a/src/plugin/utc/index.js +++ b/src/plugin/utc/index.js @@ -89,8 +89,16 @@ export default (option, Dayjs, dayjs) => { const offset = Math.abs(input) <= 16 ? input * 60 : input let ins = this if (keepLocalTime) { + const isUTCBefore = !!ins.$u ins.$offset = offset ins.$u = input === 0 + if (isUTCBefore) { + return ins + } + if (ins.$u && offset === 0) { + // notUTC to UTC and keep localTime , should offset + return ins.add(oldUtcOffset.call(ins), MIN) + } return ins } if (input !== 0) { diff --git a/test/plugin/utc-utcOffset.test.js b/test/plugin/utc-utcOffset.test.js index 771606f38..ddfec7625 100644 --- a/test/plugin/utc-utcOffset.test.js +++ b/test/plugin/utc-utcOffset.test.js @@ -13,6 +13,21 @@ afterEach(() => { MockDate.reset() }) +it('utcOffset return clone object', () => { + const original = dayjs() + const clone = original.utcOffset(0, true) + expect(original !== clone).toBeTruthy() +}) + +it('add minute after 0 utcOffset', () => { + const du = dayjs().add(1, 'minute').utcOffset(0, true) + const mu = moment().add(1, 'minute').utcOffset(0, true) + const duu = dayjs().utcOffset(0, true).add(1, 'minute') + const muu = moment().utcOffset(0, true).add(1, 'minute') + expect(duu.format()).toEqual(mu.format()) + expect(du.format()).toEqual(muu.format()) +}) + it('Set utcOffset -> Get utcOffset', () => { expect(dayjs().utcOffset(540).utcOffset()).toBe(moment().utcOffset(540).utcOffset()) expect(dayjs().utcOffset(540).format()).toBe(moment().utcOffset(540).format())