diff --git a/src/index.js b/src/index.js index af7aae3a4..29adf1d4f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ import * as C from './constant' -import U from './utils' import en from './locale/en' +import U from './utils' let L = 'en' // global locale const Ls = {} // global loaded locale @@ -43,6 +43,7 @@ const wrapper = (date, instance) => dayjs(date, { locale: instance.$L, utc: instance.$u, + x: instance.$x, $offset: instance.$offset // todo: refactor; do not use this.$offset in you code }) @@ -81,6 +82,7 @@ class Dayjs { parse(cfg) { this.$d = parseDate(cfg) + this.$x = cfg.x || {} this.init() } diff --git a/src/plugin/utc/index.js b/src/plugin/utc/index.js index 8b9147b63..078880491 100644 --- a/src/plugin/utc/index.js +++ b/src/plugin/utc/index.js @@ -1,7 +1,6 @@ import { MILLISECONDS_A_MINUTE, MIN } from '../../constant' export default (option, Dayjs, dayjs) => { - const localOffset = (new Date()).getTimezoneOffset() const proto = Dayjs.prototype dayjs.utc = function (date) { const cfg = { date, utc: true, args: arguments } // eslint-disable-line prefer-rest-params @@ -64,8 +63,11 @@ export default (option, Dayjs, dayjs) => { return ins } if (input !== 0) { - ins = this.local().add(offset + localOffset, MIN) + const localTimezoneOffset = this.$u + ? this.toDate().getTimezoneOffset() : -1 * this.utcOffset() + ins = this.local().add(offset + localTimezoneOffset, MIN) ins.$offset = offset + ins.$x.$localOffset = localTimezoneOffset } else { ins = this.utc() } @@ -81,7 +83,7 @@ export default (option, Dayjs, dayjs) => { proto.valueOf = function () { const addedOffset = !this.$utils().u(this.$offset) - ? this.$offset + localOffset : 0 + ? this.$offset + (this.$x.$localOffset || (new Date()).getTimezoneOffset()) : 0 return this.$d.valueOf() - (addedOffset * MILLISECONDS_A_MINUTE) } diff --git a/test/timezone.test.js b/test/timezone.test.js index b2366f0d4..9c0926f96 100644 --- a/test/timezone.test.js +++ b/test/timezone.test.js @@ -1,5 +1,5 @@ -import moment from 'moment' import MockDate from 'mockdate' +import moment from 'moment' import dayjs from '../src' import utc from '../src/plugin/utc' @@ -54,3 +54,11 @@ it('UTC add day in DST', () => { .toBe(momentTest.clone().add(2, 'day').format()) }) +it('UTC and utcOffset', () => { + const test1 = 1331449199000 // 2012/3/11 14:59:59 + expect(moment(test1).utcOffset(-300).format()) + .toBe(dayjs(test1).utcOffset(-300).format()) + const test2 = '2000-01-01T06:31:00Z' + expect(moment.utc(test2).utcOffset(-60).format()) + .toBe(dayjs.utc(test2).utcOffset(-60).format()) +})