Skip to content

Commit 3b1060f

Browse files
fix: update Duration plugin add/subtract take into account days in month (#2337)
1 parent 3c2c6ee commit 3b1060f

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

src/plugin/duration/index.js

+19-2
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,15 @@ class Duration {
257257
asYears() { return this.as('years') }
258258
}
259259

260+
const manipulateDuration = (date, duration, k) =>
261+
date.add(duration.years() * k, 'y')
262+
.add(duration.months() * k, 'M')
263+
.add(duration.days() * k, 'd')
264+
.add(duration.hours() * k, 'h')
265+
.add(duration.minutes() * k, 'm')
266+
.add(duration.seconds() * k, 's')
267+
.add(duration.milliseconds() * k, 'ms')
268+
260269
export default (option, Dayjs, dayjs) => {
261270
$d = dayjs
262271
$u = dayjs().$utils()
@@ -268,12 +277,20 @@ export default (option, Dayjs, dayjs) => {
268277

269278
const oldAdd = Dayjs.prototype.add
270279
const oldSubtract = Dayjs.prototype.subtract
280+
271281
Dayjs.prototype.add = function (value, unit) {
272-
if (isDuration(value)) value = value.asMilliseconds()
282+
if (isDuration(value)) {
283+
return manipulateDuration(this, value, 1)
284+
}
285+
273286
return oldAdd.bind(this)(value, unit)
274287
}
288+
275289
Dayjs.prototype.subtract = function (value, unit) {
276-
if (isDuration(value)) value = value.asMilliseconds()
290+
if (isDuration(value)) {
291+
return manipulateDuration(this, value, -1)
292+
}
293+
277294
return oldSubtract.bind(this)(value, unit)
278295
}
279296
}

test/plugin/duration.test.js

+8
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ test('Add duration', () => {
182182
const a = dayjs('2020-10-01')
183183
const days = dayjs.duration(2, 'days')
184184
expect(a.add(days).format('YYYY-MM-DD')).toBe('2020-10-03')
185+
186+
const b = dayjs('2023-02-01 00:00:00')
187+
const p = dayjs.duration('P1Y1M1DT1H1M1S')
188+
expect(b.add(p).format('YYYY-MM-DD HH:mm:ss')).toBe('2024-03-02 01:01:01')
185189
})
186190

187191
describe('Subtract', () => {
@@ -194,6 +198,10 @@ test('Subtract duration', () => {
194198
const a = dayjs('2020-10-20')
195199
const days = dayjs.duration(2, 'days')
196200
expect(a.subtract(days).format('YYYY-MM-DD')).toBe('2020-10-18')
201+
202+
const b = dayjs('2023-03-02 02:02:02')
203+
const p = dayjs.duration('P1Y1M1DT1H1M1S')
204+
expect(b.subtract(p).format('YYYY-MM-DD HH:mm:ss')).toBe('2022-02-01 01:01:01')
197205
})
198206

199207
describe('Seconds', () => {

0 commit comments

Comments
 (0)