Skip to content

Commit 27d1c50

Browse files
authored
fix: fix UTC plugin .valueOf not taking DST into account (#1448)
1 parent 24218bd commit 27d1c50

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

src/plugin/utc/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ export default (option, Dayjs, dayjs) => {
114114

115115
proto.valueOf = function () {
116116
const addedOffset = !this.$utils().u(this.$offset)
117-
? this.$offset + (this.$x.$localOffset || (new Date()).getTimezoneOffset()) : 0
117+
? this.$offset + (this.$x.$localOffset || this.$d.getTimezoneOffset()) : 0
118118
return this.$d.valueOf() - (addedOffset * MILLISECONDS_A_MINUTE)
119119
}
120120

test/plugin/timezone.test.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const NY = 'America/New_York'
2121
const VAN = 'America/Vancouver'
2222
const DEN = 'America/Denver'
2323
const TOKYO = 'Asia/Tokyo'
24+
const PARIS = 'Europe/Paris'
2425

2526
describe('Guess', () => {
2627
it('return string', () => {
@@ -212,6 +213,18 @@ describe('DST, a time that never existed Fall Back', () => {
212213
})
213214
})
214215

216+
it('DST valueOf', () => {
217+
const day1 = '2021-11-17T09:45:00.000Z'
218+
const d1 = dayjs.utc(day1).tz(PARIS)
219+
const m1 = moment.tz(day1, PARIS)
220+
expect(d1.valueOf()).toBe(m1.valueOf())
221+
222+
const day2 = '2021-05-17T09:45:00.000Z'
223+
const d2 = dayjs.utc(day2).tz(PARIS)
224+
const m2 = moment.tz(day2, PARIS)
225+
expect(d2.valueOf()).toBe(m2.valueOf())
226+
})
227+
215228
describe('set Default', () => {
216229
it('default timezone', () => {
217230
const dateStr = '2014-06-01 12:00'

test/timezone.test.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,20 @@ it('UTC add day in DST', () => {
5757
})
5858

5959
it('UTC and utcOffset', () => {
60-
const test1 = 1331449199000 // 2012/3/11 14:59:59
61-
expect(moment(test1).utcOffset(-300).format())
62-
.toBe(dayjs(test1).utcOffset(-300).format())
60+
const test1 = 1331449199000 // 2012/3/11 06:59:59 GMT+0000
61+
expect(dayjs(test1).utcOffset(-300).format())
62+
.toBe(moment(test1).utcOffset(-300).format())
6363
const test2 = '2000-01-01T06:31:00Z'
64-
expect(moment.utc(test2).utcOffset(-60).format())
65-
.toBe(dayjs.utc(test2).utcOffset(-60).format())
64+
expect(dayjs.utc(test2).utcOffset(-60).format())
65+
.toBe(moment.utc(test2).utcOffset(-60).format())
66+
67+
// across DST, copied from utc.test.js#get utc offset with a number value
68+
const time = '2021-02-28 19:40:10'
69+
const hoursOffset = -8
70+
const daysJS = dayjs(time).utc().utcOffset(hoursOffset * 60, true)
71+
const momentJS = moment(time).utc(true).utcOffset(hoursOffset, true)
72+
73+
expect(daysJS.toISOString()).toEqual(momentJS.toISOString())
6674
})
6775

6876
it('UTC diff in DST', () => {

0 commit comments

Comments
 (0)