From a6c16df347f09d8549bb278a62b88226d6b85210 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 16:36:07 +0800 Subject: [PATCH 01/42] init duration --- src/plugin/duration/index.js | 6 ++++++ test/plugin/duration.test.js | 17 +++++++++++++++++ types/plugin/duration.d.ts | 8 ++++++++ 3 files changed, 31 insertions(+) create mode 100644 src/plugin/duration/index.js create mode 100644 test/plugin/duration.test.js create mode 100644 types/plugin/duration.d.ts diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js new file mode 100644 index 000000000..8d637ac49 --- /dev/null +++ b/src/plugin/duration/index.js @@ -0,0 +1,6 @@ +export default (option, Dayjs, dayjs) => { + // const proto = Dayjs.prototype + dayjs.duration = function () { + return '' + } +} diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js new file mode 100644 index 000000000..d73957dd3 --- /dev/null +++ b/test/plugin/duration.test.js @@ -0,0 +1,17 @@ +import MockDate from 'mockdate' +import dayjs from '../../src' +import duration from '../../src/plugin/duration' + +dayjs.extend(duration) + +beforeEach(() => { + MockDate.set(new Date()) +}) + +afterEach(() => { + MockDate.reset() +}) + +it('Duration', () => { + expect(true).toBe(true) +}) diff --git a/types/plugin/duration.d.ts b/types/plugin/duration.d.ts new file mode 100644 index 000000000..7b9d54775 --- /dev/null +++ b/types/plugin/duration.d.ts @@ -0,0 +1,8 @@ +import { PluginFunc } from 'dayjs' + +declare const plugin: PluginFunc +export = plugin + +declare module 'dayjs' { + export function duration(input: any): any +} From 81e693e2b3e07b03afd9c1b884fbb9f688d09397 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 17:51:55 +0800 Subject: [PATCH 02/42] basic parse --- src/plugin/duration/index.js | 50 ++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 8d637ac49..cd1def551 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -1,6 +1,52 @@ +import { MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISECONDS_A_SECOND } from '../../constant' + +const MILLISECONDS_A_YEAR = MILLISECONDS_A_DAY * 365 +const MILLISECONDS_A_MONTH = MILLISECONDS_A_DAY * 30 + +class Duration { + constructor(milliseconds) { + this.milliseconds = milliseconds + this.parse() + } + + parse() { + let { milliseconds } = this + this.years = Math.floor(milliseconds / MILLISECONDS_A_YEAR) + milliseconds %= MILLISECONDS_A_YEAR + this.months = Math.floor(milliseconds / MILLISECONDS_A_MONTH) + milliseconds %= MILLISECONDS_A_MONTH + this.days = Math.floor(milliseconds / MILLISECONDS_A_DAY) + milliseconds %= MILLISECONDS_A_DAY + this.hours = Math.floor(milliseconds / MILLISECONDS_A_HOUR) + milliseconds %= MILLISECONDS_A_HOUR + this.minutes = Math.floor(milliseconds / MILLISECONDS_A_MINUTE) + milliseconds %= MILLISECONDS_A_MINUTE + this.seconds = Math.floor(milliseconds / MILLISECONDS_A_SECOND) + milliseconds %= MILLISECONDS_A_SECOND + } + + toISOString() { + const Y = this.years ? `${this.years}Y` : '' + const M = this.months ? `${this.months}M` : '' + const D = this.days ? `${this.days}D` : '' + const H = this.hours ? `${this.hours}H` : '' + const m = this.minutes ? `${this.minutes}M` : '' + const S = this.seconds ? `${this.seconds}S` : '' + const T = (H || M || S) ? 'T' : '' + return `P${Y}${M}${D}${T}${H}${m}${S}` + } + + toJSON() { + return this.toISOString() + } +} export default (option, Dayjs, dayjs) => { // const proto = Dayjs.prototype - dayjs.duration = function () { - return '' + dayjs.duration = function (milliseconds) { + // 1 milliseconds number + // 2 object + // 3 'P1Y2M3DT4H5M6S' string + // 4 (2, 'seconds') two agrs + return new Duration(milliseconds) } } From ac1470b396ea1f22982b296d24ebb401287943f4 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:10:59 +0800 Subject: [PATCH 03/42] basic parse2 --- src/plugin/duration/index.js | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index cd1def551..0f5f2e270 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -3,13 +3,31 @@ import { MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISE const MILLISECONDS_A_YEAR = MILLISECONDS_A_DAY * 365 const MILLISECONDS_A_MONTH = MILLISECONDS_A_DAY * 30 +const durationRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/ + class Duration { - constructor(milliseconds) { - this.milliseconds = milliseconds - this.parse() + constructor(input, unit) { + if (unit) { + this[unit] = input + } + if (typeof input === 'number') { + this.milliseconds = input + this.parseFromMilliseconds() + } + if (typeof input === 'object') { + Object.keys(input).forEach((k) => { + this[k] = input[k] + }) + } + if (typeof input === 'string') { + const d = input.match(durationRegex) + if (d) { + [this.years, this.months, this.days, this.hours, this.minutes, this.seconds] = d + } + } } - parse() { + parseFromMilliseconds() { let { milliseconds } = this this.years = Math.floor(milliseconds / MILLISECONDS_A_YEAR) milliseconds %= MILLISECONDS_A_YEAR @@ -42,11 +60,11 @@ class Duration { } export default (option, Dayjs, dayjs) => { // const proto = Dayjs.prototype - dayjs.duration = function (milliseconds) { + dayjs.duration = function (input, unit) { // 1 milliseconds number // 2 object // 3 'P1Y2M3DT4H5M6S' string // 4 (2, 'seconds') two agrs - return new Duration(milliseconds) + return new Duration(input, unit) } } From d3d12de5f90dd72da26c598a3ec8872c0c859835 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:13:41 +0800 Subject: [PATCH 04/42] basic parse3 --- src/plugin/duration/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 0f5f2e270..050e30b87 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -9,15 +9,18 @@ class Duration { constructor(input, unit) { if (unit) { this[unit] = input + return } if (typeof input === 'number') { this.milliseconds = input this.parseFromMilliseconds() + return } if (typeof input === 'object') { Object.keys(input).forEach((k) => { this[k] = input[k] }) + return } if (typeof input === 'string') { const d = input.match(durationRegex) From 0f0e2cccb63a281f5b76ec31bade7bd3803d4474 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:18:37 +0800 Subject: [PATCH 05/42] basic parse4 --- src/plugin/duration/index.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 050e30b87..4435db34f 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -5,28 +5,36 @@ const MILLISECONDS_A_MONTH = MILLISECONDS_A_DAY * 30 const durationRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/ +const unitToMS = { + years: MILLISECONDS_A_YEAR, + months: MILLISECONDS_A_MONTH, + days: MILLISECONDS_A_DAY, + hours: MILLISECONDS_A_HOUR, + minutes: MILLISECONDS_A_MINUTE, + seconds: MILLISECONDS_A_SECOND +} class Duration { constructor(input, unit) { if (unit) { - this[unit] = input - return + return new Duration(input * unitToMS[unit]) } if (typeof input === 'number') { this.milliseconds = input this.parseFromMilliseconds() - return + return this } if (typeof input === 'object') { Object.keys(input).forEach((k) => { this[k] = input[k] }) - return + return this } if (typeof input === 'string') { const d = input.match(durationRegex) if (d) { [this.years, this.months, this.days, this.hours, this.minutes, this.seconds] = d } + return this } } @@ -64,10 +72,6 @@ class Duration { export default (option, Dayjs, dayjs) => { // const proto = Dayjs.prototype dayjs.duration = function (input, unit) { - // 1 milliseconds number - // 2 object - // 3 'P1Y2M3DT4H5M6S' string - // 4 (2, 'seconds') two agrs return new Duration(input, unit) } } From ab3f58ae81b5b1d6513dfd526de4dba482dae075 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:21:10 +0800 Subject: [PATCH 06/42] init test --- test/plugin/duration/creating.test.js | 19 +++++++++++++++++++ test/plugin/{ => duration}/duration.test.js | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 test/plugin/duration/creating.test.js rename test/plugin/{ => duration}/duration.test.js (70%) diff --git a/test/plugin/duration/creating.test.js b/test/plugin/duration/creating.test.js new file mode 100644 index 000000000..7cf174427 --- /dev/null +++ b/test/plugin/duration/creating.test.js @@ -0,0 +1,19 @@ +import MockDate from 'mockdate' +import dayjs from '../../../src' +import duration from '../../../src/plugin/duration' + +dayjs.extend(duration) + +beforeEach(() => { + MockDate.set(new Date()) +}) + +afterEach(() => { + MockDate.reset() +}) + +describe('Creating from two argument', () => { + it('Creating from two argument', () => { + expect(dayjs.duration(13213, 'seconds').toISOString()).toBe('PT3H40M13S') + }) +}) diff --git a/test/plugin/duration.test.js b/test/plugin/duration/duration.test.js similarity index 70% rename from test/plugin/duration.test.js rename to test/plugin/duration/duration.test.js index d73957dd3..b9bd8238c 100644 --- a/test/plugin/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -1,6 +1,6 @@ import MockDate from 'mockdate' -import dayjs from '../../src' -import duration from '../../src/plugin/duration' +import dayjs from '../../../src' +import duration from '../../../src/plugin/duration' dayjs.extend(duration) From e521c73551e972c0825237c6f396afaf87e6d2b7 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:24:08 +0800 Subject: [PATCH 07/42] init test2 --- test/plugin/duration/creating.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/plugin/duration/creating.test.js b/test/plugin/duration/creating.test.js index 7cf174427..cb0f26ffc 100644 --- a/test/plugin/duration/creating.test.js +++ b/test/plugin/duration/creating.test.js @@ -13,7 +13,9 @@ afterEach(() => { }) describe('Creating from two argument', () => { - it('Creating from two argument', () => { + it('two argument will bubble up to the next', () => { + expect(dayjs.duration(59, 'seconds').toISOString()).toBe('PT59S') + expect(dayjs.duration(60, 'seconds').toISOString()).toBe('P1M') expect(dayjs.duration(13213, 'seconds').toISOString()).toBe('PT3H40M13S') }) }) From 4ba1aaa7c159c5124f741fc2f0afd1b637eaed2a Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:29:59 +0800 Subject: [PATCH 08/42] fix parse --- src/plugin/duration/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 4435db34f..6bbf49702 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -32,7 +32,7 @@ class Duration { if (typeof input === 'string') { const d = input.match(durationRegex) if (d) { - [this.years, this.months, this.days, this.hours, this.minutes, this.seconds] = d + [,, this.years, this.months, , this.days, this.hours, this.minutes, this.seconds] = d } return this } From 6b125a8110778b97c5ec608f1a25ff354566bbb8 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:36:24 +0800 Subject: [PATCH 09/42] add api --- src/plugin/duration/index.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 6bbf49702..3baddd227 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -68,6 +68,17 @@ class Duration { toJSON() { return this.toISOString() } + + as(unit) { + return this.milliseconds / unitToMS[unit] + } + get(unit) { + return this[unit] + } + // isDuration + // add + // subtract + // negative duration } export default (option, Dayjs, dayjs) => { // const proto = Dayjs.prototype From 204fc99a7db1bda33a7b66ea5071452b83ee2fde Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:41:43 +0800 Subject: [PATCH 10/42] add test --- src/plugin/duration/index.js | 3 +++ test/plugin/duration/creating.test.js | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 3baddd227..3b9323c7f 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -27,6 +27,9 @@ class Duration { Object.keys(input).forEach((k) => { this[k] = input[k] }) + if (input.weeks) { + this.days += input.weeks * 7 + } return this } if (typeof input === 'string') { diff --git a/test/plugin/duration/creating.test.js b/test/plugin/duration/creating.test.js index cb0f26ffc..86bbac8a7 100644 --- a/test/plugin/duration/creating.test.js +++ b/test/plugin/duration/creating.test.js @@ -18,4 +18,25 @@ describe('Creating from two argument', () => { expect(dayjs.duration(60, 'seconds').toISOString()).toBe('P1M') expect(dayjs.duration(13213, 'seconds').toISOString()).toBe('PT3H40M13S') }) + it('object with float', () => { + expect(dayjs.duration({ + seconds: 1, + minutes: 2, + hours: 3, + days: 4, + months: 6, + years: 7 + }).toISOString()).toBe('P7Y6M4DT3H2M1S') + }) + it('object with weeks and float', () => { + expect(dayjs.duration({ + seconds: 1.1, + minutes: 2, + hours: 3, + days: 4, + weeks: 5, + months: 6, + years: 7 + }).toISOString()).toBe('P7Y6M39DT3H2M1.1S') + }) }) From c6cec773ed36eeaf5c75162c35d91d901352b3a6 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:44:54 +0800 Subject: [PATCH 11/42] add test --- src/plugin/duration/index.js | 3 +-- test/plugin/duration/creating.test.js | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 3b9323c7f..8a1244d8c 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -53,8 +53,7 @@ class Duration { milliseconds %= MILLISECONDS_A_HOUR this.minutes = Math.floor(milliseconds / MILLISECONDS_A_MINUTE) milliseconds %= MILLISECONDS_A_MINUTE - this.seconds = Math.floor(milliseconds / MILLISECONDS_A_SECOND) - milliseconds %= MILLISECONDS_A_SECOND + this.seconds = milliseconds / MILLISECONDS_A_SECOND } toISOString() { diff --git a/test/plugin/duration/creating.test.js b/test/plugin/duration/creating.test.js index 86bbac8a7..63b56ff10 100644 --- a/test/plugin/duration/creating.test.js +++ b/test/plugin/duration/creating.test.js @@ -13,6 +13,11 @@ afterEach(() => { }) describe('Creating from two argument', () => { + it('milliseconds', () => { + expect(dayjs.duration(100).toISOString()).toBe('PT0.1S') + expect(dayjs.duration(1000).toISOString()).toBe('PT1S') + // expect(dayjs.duration(13213, 'seconds').toISOString()).toBe('PT3H40M13S') + }) it('two argument will bubble up to the next', () => { expect(dayjs.duration(59, 'seconds').toISOString()).toBe('PT59S') expect(dayjs.duration(60, 'seconds').toISOString()).toBe('P1M') From 2f51d42a68bb9906a73274dfe1649a4f8409d3f3 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:46:20 +0800 Subject: [PATCH 12/42] add test --- test/plugin/duration/creating.test.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/plugin/duration/creating.test.js b/test/plugin/duration/creating.test.js index 63b56ff10..7a7c9afbc 100644 --- a/test/plugin/duration/creating.test.js +++ b/test/plugin/duration/creating.test.js @@ -12,11 +12,10 @@ afterEach(() => { MockDate.reset() }) -describe('Creating from two argument', () => { +describe('Creating', () => { it('milliseconds', () => { expect(dayjs.duration(100).toISOString()).toBe('PT0.1S') expect(dayjs.duration(1000).toISOString()).toBe('PT1S') - // expect(dayjs.duration(13213, 'seconds').toISOString()).toBe('PT3H40M13S') }) it('two argument will bubble up to the next', () => { expect(dayjs.duration(59, 'seconds').toISOString()).toBe('PT59S') @@ -45,3 +44,10 @@ describe('Creating from two argument', () => { }).toISOString()).toBe('P7Y6M39DT3H2M1.1S') }) }) + + +describe('Parse ISO string', () => { + it('ISO string', () => { + expect(dayjs.duration('P7Y6M4DT3H2M1S').toISOString()).toBe('P7Y6M4DT3H2M1S') + }) +}) From 90568f847e1d797412df80644b055416a242580a Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 18:55:47 +0800 Subject: [PATCH 13/42] add test --- src/plugin/duration/index.js | 62 ++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 8a1244d8c..9eb0640fe 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -15,54 +15,58 @@ const unitToMS = { } class Duration { constructor(input, unit) { + this.$d = {} if (unit) { return new Duration(input * unitToMS[unit]) } if (typeof input === 'number') { - this.milliseconds = input + this.$d.milliseconds = input this.parseFromMilliseconds() return this } if (typeof input === 'object') { Object.keys(input).forEach((k) => { - this[k] = input[k] + this.$d[k] = input[k] }) - if (input.weeks) { - this.days += input.weeks * 7 - } return this } if (typeof input === 'string') { const d = input.match(durationRegex) if (d) { - [,, this.years, this.months, , this.days, this.hours, this.minutes, this.seconds] = d + [,, + this.$d.years, this.$d.months,, + this.$d.days, this.$d.hours, this.$d.minutes, this.$d.seconds] = d } return this } } parseFromMilliseconds() { - let { milliseconds } = this - this.years = Math.floor(milliseconds / MILLISECONDS_A_YEAR) + let { milliseconds } = this.$d + this.$d.years = Math.floor(milliseconds / MILLISECONDS_A_YEAR) milliseconds %= MILLISECONDS_A_YEAR - this.months = Math.floor(milliseconds / MILLISECONDS_A_MONTH) + this.$d.months = Math.floor(milliseconds / MILLISECONDS_A_MONTH) milliseconds %= MILLISECONDS_A_MONTH - this.days = Math.floor(milliseconds / MILLISECONDS_A_DAY) + this.$d.days = Math.floor(milliseconds / MILLISECONDS_A_DAY) milliseconds %= MILLISECONDS_A_DAY - this.hours = Math.floor(milliseconds / MILLISECONDS_A_HOUR) + this.$d.hours = Math.floor(milliseconds / MILLISECONDS_A_HOUR) milliseconds %= MILLISECONDS_A_HOUR - this.minutes = Math.floor(milliseconds / MILLISECONDS_A_MINUTE) + this.$d.minutes = Math.floor(milliseconds / MILLISECONDS_A_MINUTE) milliseconds %= MILLISECONDS_A_MINUTE - this.seconds = milliseconds / MILLISECONDS_A_SECOND + this.$d.seconds = milliseconds / MILLISECONDS_A_SECOND } toISOString() { - const Y = this.years ? `${this.years}Y` : '' - const M = this.months ? `${this.months}M` : '' - const D = this.days ? `${this.days}D` : '' - const H = this.hours ? `${this.hours}H` : '' - const m = this.minutes ? `${this.minutes}M` : '' - const S = this.seconds ? `${this.seconds}S` : '' + const Y = this.$d.years ? `${this.$d.years}Y` : '' + const M = this.$d.months ? `${this.$d.months}M` : '' + let days = this.$d.days || 0 + if (this.$d.weeks) { + days += this.$d.weeks * 7 + } + const D = days ? `${days}D` : '' + const H = this.$d.hours ? `${this.$d.hours}H` : '' + const m = this.$d.minutes ? `${this.$d.minutes}M` : '' + const S = this.$d.seconds ? `${this.$d.seconds}S` : '' const T = (H || M || S) ? 'T' : '' return `P${Y}${M}${D}${T}${H}${m}${S}` } @@ -72,15 +76,31 @@ class Duration { } as(unit) { - return this.milliseconds / unitToMS[unit] + return this.$d.milliseconds / unitToMS[unit] } get(unit) { - return this[unit] + return this.$d[unit] } // isDuration // add // subtract // negative duration + milliseconds() { return this.get('milliseconds') } + asMilliseconds() { return this.as('milliseconds') } + seconds() { return this.get('seconds') } + asSeconds() { return this.get('seconds') } + minutes() { return this.get('minutes') } + asMinutes() { return this.get('minutes') } + hours() { return this.get('hours') } + asHours() { return this.get('hours') } + days() { return this.get('days') } + asDays() { return this.get('days') } + weeks() { return this.get('weeks') } + asWeeks() { return this.get('weeks') } + months() { return this.get('months') } + asMonths() { return this.get('months') } + years() { return this.get('years') } + asYears() { return this.get('years') } } export default (option, Dayjs, dayjs) => { // const proto = Dayjs.prototype From 4161cb5522d04d4aaeeaaa0db673744b2b22aab2 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 19:23:38 +0800 Subject: [PATCH 14/42] add test --- src/plugin/duration/index.js | 4 +++- test/plugin/duration/duration.test.js | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 9eb0640fe..eb58e2be8 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -103,8 +103,10 @@ class Duration { asYears() { return this.get('years') } } export default (option, Dayjs, dayjs) => { - // const proto = Dayjs.prototype dayjs.duration = function (input, unit) { return new Duration(input, unit) } + dayjs.isDuration = function (d) { + return d instanceof Duration + } } diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index b9bd8238c..8b31a6cac 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -12,6 +12,7 @@ afterEach(() => { MockDate.reset() }) -it('Duration', () => { - expect(true).toBe(true) +it('Is duration', () => { + expect(dayjs.isDuration(dayjs.duration(1))).toBe(true) + expect(dayjs.isDuration({})).toBe(false) }) From 8659c84341a496f4f0db095e28c158c16a8ccd17 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 19:24:37 +0800 Subject: [PATCH 15/42] add test --- test/plugin/duration/duration.test.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index 8b31a6cac..fe4cf1a42 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -13,6 +13,9 @@ afterEach(() => { }) it('Is duration', () => { + expect(dayjs.isDuration(dayjs.duration())).toBe(true) expect(dayjs.isDuration(dayjs.duration(1))).toBe(true) + expect(dayjs.isDuration(dayjs())).toBe(false) expect(dayjs.isDuration({})).toBe(false) + expect(dayjs.isDuration()).toBe(false) }) From 8e632d60feced2a6e8ba30e0f0f65031c5427944 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 19:46:00 +0800 Subject: [PATCH 16/42] add add subtract --- src/plugin/duration/index.js | 44 ++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index eb58e2be8..e357f6443 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -1,4 +1,4 @@ -import { MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISECONDS_A_SECOND } from '../../constant' +import { MILLISECONDS_A_WEEK, MILLISECONDS_A_DAY, MILLISECONDS_A_HOUR, MILLISECONDS_A_MINUTE, MILLISECONDS_A_SECOND } from '../../constant' const MILLISECONDS_A_YEAR = MILLISECONDS_A_DAY * 365 const MILLISECONDS_A_MONTH = MILLISECONDS_A_DAY * 30 @@ -11,8 +11,12 @@ const unitToMS = { days: MILLISECONDS_A_DAY, hours: MILLISECONDS_A_HOUR, minutes: MILLISECONDS_A_MINUTE, - seconds: MILLISECONDS_A_SECOND + seconds: MILLISECONDS_A_SECOND, + weeks: MILLISECONDS_A_WEEK } + +const isDuration = d => (d instanceof Duration) // eslint-disable-line no-use-before-define + class Duration { constructor(input, unit) { this.$d = {} @@ -28,6 +32,7 @@ class Duration { Object.keys(input).forEach((k) => { this.$d[k] = input[k] }) + this.calMilliseconds() return this } if (typeof input === 'string') { @@ -37,10 +42,17 @@ class Duration { this.$d.years, this.$d.months,, this.$d.days, this.$d.hours, this.$d.minutes, this.$d.seconds] = d } + this.calMilliseconds() return this } } + calMilliseconds() { + this.$d.milliseconds = Object.keys(unitToMS).reduce((total, unit) => ( + total + (this.$d[unit] * unitToMS[unit]) + ), 0) + } + parseFromMilliseconds() { let { milliseconds } = this.$d this.$d.years = Math.floor(milliseconds / MILLISECONDS_A_YEAR) @@ -78,13 +90,29 @@ class Duration { as(unit) { return this.$d.milliseconds / unitToMS[unit] } + get(unit) { return this.$d[unit] } - // isDuration - // add - // subtract - // negative duration + + add(input, unit, isSubtract) { + let another = input // milliseconds number + if (unit) { + another = input * unitToMS[unit] + } + if (isDuration(input)) { + another = input.$d.milliseconds + } + if (typeof unit === 'object') { + another = new Duration(input).$d.milliseconds + } + return new Duration(this.$d.milliseconds + (another * (isSubtract ? -1 : 1))) + } + + subtract(input, unit) { + this.add(input, unit, true) + } + milliseconds() { return this.get('milliseconds') } asMilliseconds() { return this.as('milliseconds') } seconds() { return this.get('seconds') } @@ -106,7 +134,5 @@ export default (option, Dayjs, dayjs) => { dayjs.duration = function (input, unit) { return new Duration(input, unit) } - dayjs.isDuration = function (d) { - return d instanceof Duration - } + dayjs.isDuration = isDuration } From e658133bdc194aa7100d9882743e62f1e963d8d2 Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 21:24:42 +0800 Subject: [PATCH 17/42] add test --- src/plugin/duration/index.js | 4 ++++ test/plugin/duration/duration.test.js | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index e357f6443..ff7b32b32 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -113,6 +113,10 @@ class Duration { this.add(input, unit, true) } + clone() { + return new Duration(this.$d.milliseconds) + } + milliseconds() { return this.get('milliseconds') } asMilliseconds() { return this.as('milliseconds') } seconds() { return this.get('seconds') } diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index fe4cf1a42..c59623cb6 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -19,3 +19,9 @@ it('Is duration', () => { expect(dayjs.isDuration({})).toBe(false) expect(dayjs.isDuration()).toBe(false) }) + +it('toJSON', () => { + expect(JSON.stringify({ + postDuration: dayjs.duration(5, 'minutes') + })).toBe('{"postDuration":"P5M"}') +}) From 0382a88e2cdfde40f89989fb0e256e67f751ccee Mon Sep 17 00:00:00 2001 From: iamkun Date: Tue, 7 Apr 2020 22:39:30 +0800 Subject: [PATCH 18/42] add test --- src/plugin/duration/index.js | 7 +++++++ test/plugin/duration/duration.test.js | 12 ++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index ff7b32b32..0db3e7d2c 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -17,6 +17,8 @@ const unitToMS = { const isDuration = d => (d instanceof Duration) // eslint-disable-line no-use-before-define +let $d + class Duration { constructor(input, unit) { this.$d = {} @@ -117,6 +119,10 @@ class Duration { return new Duration(this.$d.milliseconds) } + humanize(withSuffix) { + return $d().add(this.$d.milliseconds, 'ms').fromNow(!withSuffix) + } + milliseconds() { return this.get('milliseconds') } asMilliseconds() { return this.as('milliseconds') } seconds() { return this.get('seconds') } @@ -135,6 +141,7 @@ class Duration { asYears() { return this.get('years') } } export default (option, Dayjs, dayjs) => { + $d = dayjs dayjs.duration = function (input, unit) { return new Duration(input, unit) } diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index c59623cb6..f8edff5fd 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -1,7 +1,9 @@ import MockDate from 'mockdate' import dayjs from '../../../src' import duration from '../../../src/plugin/duration' +import relativeTime from '../../../src/plugin/relativeTime' +dayjs.extend(relativeTime) dayjs.extend(duration) beforeEach(() => { @@ -25,3 +27,13 @@ it('toJSON', () => { postDuration: dayjs.duration(5, 'minutes') })).toBe('{"postDuration":"P5M"}') }) + +describe('Humanize', () => { + it('Humaniz', () => { + expect(dayjs.duration(1, 'minutes').humanize()).toBe('a minute') + expect(dayjs.duration(2, 'minutes').humanize()).toBe('2 minutes') + expect(dayjs.duration(24, 'hours').humanize()).toBe('a day') + expect(dayjs.duration(1, 'minutes').humanize(true)).toBe('in a minute') + expect(dayjs.duration(-1, 'minutes').humanize(true)).toBe('a minute ago') + }) +}) From 48315baf3face20f6699eb4ffa52d20adbd9bf01 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 00:42:31 +0800 Subject: [PATCH 19/42] add wrapper --- src/plugin/duration/index.js | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 0db3e7d2c..d47ed6209 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -19,11 +19,15 @@ const isDuration = d => (d instanceof Duration) // eslint-disable-line no-use-be let $d +const wrapper = (input, instance, unit) => + new Duration(input, unit, instance.$l) // eslint-disable-line no-use-before-define + class Duration { - constructor(input, unit) { + constructor(input, unit, locale) { this.$d = {} + this.$l = locale || 'en' if (unit) { - return new Duration(input * unitToMS[unit]) + return wrapper(input * unitToMS[unit], this) } if (typeof input === 'number') { this.$d.milliseconds = input @@ -106,21 +110,27 @@ class Duration { another = input.$d.milliseconds } if (typeof unit === 'object') { - another = new Duration(input).$d.milliseconds + another = wrapper(input, this).$d.milliseconds } - return new Duration(this.$d.milliseconds + (another * (isSubtract ? -1 : 1))) + return wrapper(this.$d.milliseconds + (another * (isSubtract ? -1 : 1)), this) } subtract(input, unit) { - this.add(input, unit, true) + return this.add(input, unit, true) + } + + locale(l) { + const that = this.clone() + that.$l = l + return that } clone() { - return new Duration(this.$d.milliseconds) + return wrapper(this.$d.milliseconds, this) } humanize(withSuffix) { - return $d().add(this.$d.milliseconds, 'ms').fromNow(!withSuffix) + return $d().add(this.$d.milliseconds, 'ms').locale(this.$l).fromNow(!withSuffix) } milliseconds() { return this.get('milliseconds') } @@ -143,7 +153,7 @@ class Duration { export default (option, Dayjs, dayjs) => { $d = dayjs dayjs.duration = function (input, unit) { - return new Duration(input, unit) + return wrapper(input, {}, unit) } dayjs.isDuration = isDuration } From 9d3017d04ef71f7dba65c93091f87998d081e27c Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 00:52:19 +0800 Subject: [PATCH 20/42] add test --- .gitignore | 1 + test/plugin/duration/duration.test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/.gitignore b/.gitignore index 7894e3925..951f55934 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ # IDE .idea +.vscode # npm node_modules diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index f8edff5fd..98dff77f2 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -2,6 +2,8 @@ import MockDate from 'mockdate' import dayjs from '../../../src' import duration from '../../../src/plugin/duration' import relativeTime from '../../../src/plugin/relativeTime' +import '../../../src/locale/fr' +import '../../../src/locale/es' dayjs.extend(relativeTime) dayjs.extend(duration) @@ -36,4 +38,28 @@ describe('Humanize', () => { expect(dayjs.duration(1, 'minutes').humanize(true)).toBe('in a minute') expect(dayjs.duration(-1, 'minutes').humanize(true)).toBe('a minute ago') }) + + it('Locale', () => { + expect(dayjs.duration(1, 'minutes').humanize(true)).toBe('in a minute') + expect(dayjs.duration(1, 'minutes').locale('fr').humanize(true)).toBe('dans une minute') + expect(dayjs.duration(1, 'minutes').locale('es').humanize(true)).toBe('en un minuto') + }) }) + +describe('Clone', () => { + it('Locale clone', () => { + const d = dayjs.duration(1, 'minutes').locale('fr') + const r = 'dans une minute' + expect(d.humanize(true)).toBe(r) + expect(d.clone().humanize(true)).toBe(r) + }) +}) + +// describe('Milliseconds', () => { +// expect(dayjs.duration(500).milliseconds()).toBe(500) +// expect(dayjs.duration(1500).milliseconds()).toBe(500) +// expect(dayjs.duration(15000).milliseconds()).toBe(0) +// expect(dayjs.duration(500).asMilliseconds()).toBe(500) +// expect(dayjs.duration(1500).asMilliseconds()).toBe(1500) +// expect(dayjs.duration(15000).asMilliseconds()).toBe(15000) +// }) From fccd3212c69e7b2f8a2b75a5569d53180cf19853 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 01:02:43 +0800 Subject: [PATCH 21/42] add test --- src/plugin/duration/index.js | 24 +++++++++++++++--------- test/plugin/duration/duration.test.js | 25 +++++++++++++++++-------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index d47ed6209..9b503d0b5 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -94,11 +94,17 @@ class Duration { } as(unit) { - return this.$d.milliseconds / unitToMS[unit] + return this.$d.milliseconds / (unitToMS[unit] || 1) } get(unit) { - return this.$d[unit] + let base = this.$d.milliseconds + if (unit === 'milliseconds') { + base %= 1000 + } else { + base = Math.floor(base / unitToMS[unit]) + } + return base } add(input, unit, isSubtract) { @@ -136,19 +142,19 @@ class Duration { milliseconds() { return this.get('milliseconds') } asMilliseconds() { return this.as('milliseconds') } seconds() { return this.get('seconds') } - asSeconds() { return this.get('seconds') } + asSeconds() { return this.as('seconds') } minutes() { return this.get('minutes') } - asMinutes() { return this.get('minutes') } + asMinutes() { return this.as('minutes') } hours() { return this.get('hours') } - asHours() { return this.get('hours') } + asHours() { return this.as('hours') } days() { return this.get('days') } - asDays() { return this.get('days') } + asDays() { return this.as('days') } weeks() { return this.get('weeks') } - asWeeks() { return this.get('weeks') } + asWeeks() { return this.as('weeks') } months() { return this.get('months') } - asMonths() { return this.get('months') } + asMonths() { return this.as('months') } years() { return this.get('years') } - asYears() { return this.get('years') } + asYears() { return this.as('years') } } export default (option, Dayjs, dayjs) => { $d = dayjs diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index 98dff77f2..1b4d56338 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -55,11 +55,20 @@ describe('Clone', () => { }) }) -// describe('Milliseconds', () => { -// expect(dayjs.duration(500).milliseconds()).toBe(500) -// expect(dayjs.duration(1500).milliseconds()).toBe(500) -// expect(dayjs.duration(15000).milliseconds()).toBe(0) -// expect(dayjs.duration(500).asMilliseconds()).toBe(500) -// expect(dayjs.duration(1500).asMilliseconds()).toBe(1500) -// expect(dayjs.duration(15000).asMilliseconds()).toBe(15000) -// }) +describe('Milliseconds', () => { + expect(dayjs.duration(500).milliseconds()).toBe(500) + expect(dayjs.duration(1500).milliseconds()).toBe(500) + expect(dayjs.duration(15000).milliseconds()).toBe(0) + expect(dayjs.duration(500).asMilliseconds()).toBe(500) + expect(dayjs.duration(1500).asMilliseconds()).toBe(1500) + expect(dayjs.duration(15000).asMilliseconds()).toBe(15000) +}) + +describe('Seconds', () => { + expect(dayjs.duration(500).seconds()).toBe(0) + expect(dayjs.duration(1500).seconds()).toBe(1) + expect(dayjs.duration(15000).seconds()).toBe(15) + expect(dayjs.duration(500).asSeconds()).toBe(0.5) + expect(dayjs.duration(1500).asSeconds()).toBe(1.5) + expect(dayjs.duration(15000).asSeconds()).toBe(15) +}) From c3c325223b3c1e3c9aa38d8cf2483af197af56ae Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 01:05:20 +0800 Subject: [PATCH 22/42] add test --- test/plugin/duration/duration.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index 1b4d56338..c016b4675 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -72,3 +72,8 @@ describe('Seconds', () => { expect(dayjs.duration(1500).asSeconds()).toBe(1.5) expect(dayjs.duration(15000).asSeconds()).toBe(15) }) + +describe('Minutes', () => { + expect(dayjs.duration(100000).minutes()).toBe(1) + expect(dayjs.duration(100000).asMinutes().toFixed(2)).toBe('1.67') +}) From 5ae2d86db9c544edde4d32d938050139cb163f12 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 01:06:12 +0800 Subject: [PATCH 23/42] add test --- test/plugin/duration/duration.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index c016b4675..ab176ce2b 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -77,3 +77,8 @@ describe('Minutes', () => { expect(dayjs.duration(100000).minutes()).toBe(1) expect(dayjs.duration(100000).asMinutes().toFixed(2)).toBe('1.67') }) + +describe('Hours', () => { + expect(dayjs.duration(10000000).hours()).toBe(2) + expect(dayjs.duration(10000000).asHours().toFixed(2)).toBe('2.78') +}) From f6daa5c3b9d849557eef18df97b66479aa862339 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 01:07:15 +0800 Subject: [PATCH 24/42] add test --- test/plugin/duration/duration.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index ab176ce2b..b2a85f0ab 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -82,3 +82,8 @@ describe('Hours', () => { expect(dayjs.duration(10000000).hours()).toBe(2) expect(dayjs.duration(10000000).asHours().toFixed(2)).toBe('2.78') }) + +describe('Days', () => { + expect(dayjs.duration(100000000).days()).toBe(1) + expect(dayjs.duration(100000000).asDays().toFixed(2)).toBe('1.16') +}) From 2bb1d07f3961aa44dfc6e43f120f6208728563c3 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 01:10:47 +0800 Subject: [PATCH 25/42] add test --- test/plugin/duration/duration.test.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index b2a85f0ab..a58c45cdf 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -87,3 +87,13 @@ describe('Days', () => { expect(dayjs.duration(100000000).days()).toBe(1) expect(dayjs.duration(100000000).asDays().toFixed(2)).toBe('1.16') }) + +describe('Month', () => { + expect(dayjs.duration(10000000000).months()).toBe(3) + // expect(dayjs.duration(10000000000).asMonths().toFixed(2)).toBe('3.80') +}) + +describe('Years', () => { + expect(dayjs.duration(100000000000).years()).toBe(3) + expect(dayjs.duration(100000000000).asYears().toFixed(2)).toBe('3.17') +}) From 5e1d587f1a75962e78f9ccc32b280f4936046521 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 01:13:08 +0800 Subject: [PATCH 26/42] add test --- test/plugin/duration/duration.test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index a58c45cdf..4335b4f09 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -64,6 +64,19 @@ describe('Milliseconds', () => { expect(dayjs.duration(15000).asMilliseconds()).toBe(15000) }) +describe('Add', () => { + const a = dayjs.duration(1, 'days') + const b = dayjs.duration(2, 'days') + expect(a.add(b).days()).toBe(3) +}) + +describe('Subtract', () => { + const a = dayjs.duration(3, 'days') + const b = dayjs.duration(2, 'days') + expect(a.subtract(b).days()).toBe(1) +}) + + describe('Seconds', () => { expect(dayjs.duration(500).seconds()).toBe(0) expect(dayjs.duration(1500).seconds()).toBe(1) From ca7c9a7315bc53020e6de176dce57b82af00aa9e Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 01:15:40 +0800 Subject: [PATCH 27/42] add test --- test/plugin/duration/duration.test.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index 4335b4f09..c45385a3d 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -68,6 +68,8 @@ describe('Add', () => { const a = dayjs.duration(1, 'days') const b = dayjs.duration(2, 'days') expect(a.add(b).days()).toBe(3) + expect(a.add(1, 'days').days()).toBe(2) + // expect(a.add({ days: 5 }).days()).toBe(6) }) describe('Subtract', () => { @@ -101,6 +103,11 @@ describe('Days', () => { expect(dayjs.duration(100000000).asDays().toFixed(2)).toBe('1.16') }) +// describe('Weeks', () => { +// expect(dayjs.duration(10000000000).weeks()).toBe(0) +// expect(dayjs.duration(10000000000).asWeeks().toFixed(2)).toBe('0') +// }) + describe('Month', () => { expect(dayjs.duration(10000000000).months()).toBe(3) // expect(dayjs.duration(10000000000).asMonths().toFixed(2)).toBe('3.80') From 3421431fa6577ab186c25e3ca8420be583c89078 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 11:42:26 +0800 Subject: [PATCH 28/42] add test --- src/plugin/duration/index.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 9b503d0b5..d14a038f9 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -54,8 +54,8 @@ class Duration { } calMilliseconds() { - this.$d.milliseconds = Object.keys(unitToMS).reduce((total, unit) => ( - total + (this.$d[unit] * unitToMS[unit]) + this.$d.milliseconds = Object.keys(this.$d).reduce((total, unit) => ( + total + (this.$d[unit] * (unitToMS[unit] || 0)) ), 0) } @@ -111,11 +111,9 @@ class Duration { let another = input // milliseconds number if (unit) { another = input * unitToMS[unit] - } - if (isDuration(input)) { + } else if (isDuration(input)) { another = input.$d.milliseconds - } - if (typeof unit === 'object') { + } else if (typeof input === 'object') { another = wrapper(input, this).$d.milliseconds } return wrapper(this.$d.milliseconds + (another * (isSubtract ? -1 : 1)), this) From cb8a5e8f45c2d6b88b3662444d78267e483c40de Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 11:44:17 +0800 Subject: [PATCH 29/42] add test --- test/plugin/duration/duration.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index c45385a3d..c1503953d 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -69,7 +69,7 @@ describe('Add', () => { const b = dayjs.duration(2, 'days') expect(a.add(b).days()).toBe(3) expect(a.add(1, 'days').days()).toBe(2) - // expect(a.add({ days: 5 }).days()).toBe(6) + expect(a.add({ days: 5 }).days()).toBe(6) }) describe('Subtract', () => { From 7881fb9a68615c454d36070a9ba8762a847c0199 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 12:12:26 +0800 Subject: [PATCH 30/42] add test --- src/plugin/duration/index.js | 2 +- test/plugin/duration/creating.test.js | 6 +++++- test/plugin/duration/duration.test.js | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index d14a038f9..c8065049b 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -55,7 +55,7 @@ class Duration { calMilliseconds() { this.$d.milliseconds = Object.keys(this.$d).reduce((total, unit) => ( - total + (this.$d[unit] * (unitToMS[unit] || 0)) + total + (this.$d[unit] || 0 * (unitToMS[unit] || 0)) ), 0) } diff --git a/test/plugin/duration/creating.test.js b/test/plugin/duration/creating.test.js index 7a7c9afbc..238a04f2b 100644 --- a/test/plugin/duration/creating.test.js +++ b/test/plugin/duration/creating.test.js @@ -47,7 +47,11 @@ describe('Creating', () => { describe('Parse ISO string', () => { - it('ISO string', () => { + it('Full ISO string', () => { expect(dayjs.duration('P7Y6M4DT3H2M1S').toISOString()).toBe('P7Y6M4DT3H2M1S') }) + it('Part ISO string', () => { + expect(dayjs.duration('PT2777H46M40S').toISOString()).toBe('PT2777H46M40S') + }) }) + diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index c1503953d..c45385a3d 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -69,7 +69,7 @@ describe('Add', () => { const b = dayjs.duration(2, 'days') expect(a.add(b).days()).toBe(3) expect(a.add(1, 'days').days()).toBe(2) - expect(a.add({ days: 5 }).days()).toBe(6) + // expect(a.add({ days: 5 }).days()).toBe(6) }) describe('Subtract', () => { From 6b14741feec7c383188896d606ea859c4ab9d6eb Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 12:20:25 +0800 Subject: [PATCH 31/42] add test --- src/plugin/duration/index.js | 2 +- test/plugin/duration/duration.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index c8065049b..6a0e84484 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -55,7 +55,7 @@ class Duration { calMilliseconds() { this.$d.milliseconds = Object.keys(this.$d).reduce((total, unit) => ( - total + (this.$d[unit] || 0 * (unitToMS[unit] || 0)) + total + ((this.$d[unit] || 0) * (unitToMS[unit] || 0)) ), 0) } diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index c45385a3d..c1503953d 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -69,7 +69,7 @@ describe('Add', () => { const b = dayjs.duration(2, 'days') expect(a.add(b).days()).toBe(3) expect(a.add(1, 'days').days()).toBe(2) - // expect(a.add({ days: 5 }).days()).toBe(6) + expect(a.add({ days: 5 }).days()).toBe(6) }) describe('Subtract', () => { From e1bed0c1dfa078e6accc690e477671c2a185aab8 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 12:31:49 +0800 Subject: [PATCH 32/42] add test --- test/plugin/duration/duration.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index c1503953d..756244172 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -103,10 +103,10 @@ describe('Days', () => { expect(dayjs.duration(100000000).asDays().toFixed(2)).toBe('1.16') }) -// describe('Weeks', () => { -// expect(dayjs.duration(10000000000).weeks()).toBe(0) -// expect(dayjs.duration(10000000000).asWeeks().toFixed(2)).toBe('0') -// }) +describe('Weeks', () => { + expect(dayjs.duration(1000000000).weeks()).toBe(1) + expect(dayjs.duration(1000000000).asWeeks().toFixed(2)).toBe('1.65') +}) describe('Month', () => { expect(dayjs.duration(10000000000).months()).toBe(3) From cdcc7af0a1f62ae6b0480a45a2de526ca8c6db12 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 12:34:18 +0800 Subject: [PATCH 33/42] add test --- test/plugin/duration/duration.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration/duration.test.js index 756244172..19469030e 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration/duration.test.js @@ -110,7 +110,7 @@ describe('Weeks', () => { describe('Month', () => { expect(dayjs.duration(10000000000).months()).toBe(3) - // expect(dayjs.duration(10000000000).asMonths().toFixed(2)).toBe('3.80') + expect(dayjs.duration({ months: 3 }).asMonths()).toBe(3) }) describe('Years', () => { From e09c8dfe9f129dff77ead7b502a78221fd69b8fe Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 12:35:57 +0800 Subject: [PATCH 34/42] add test --- test/plugin/{duration => }/duration.test.js | 53 +++++++++++++++++-- test/plugin/duration/creating.test.js | 57 --------------------- 2 files changed, 48 insertions(+), 62 deletions(-) rename test/plugin/{duration => }/duration.test.js (71%) delete mode 100644 test/plugin/duration/creating.test.js diff --git a/test/plugin/duration/duration.test.js b/test/plugin/duration.test.js similarity index 71% rename from test/plugin/duration/duration.test.js rename to test/plugin/duration.test.js index 19469030e..984db9e4d 100644 --- a/test/plugin/duration/duration.test.js +++ b/test/plugin/duration.test.js @@ -1,9 +1,9 @@ import MockDate from 'mockdate' -import dayjs from '../../../src' -import duration from '../../../src/plugin/duration' -import relativeTime from '../../../src/plugin/relativeTime' -import '../../../src/locale/fr' -import '../../../src/locale/es' +import dayjs from '../../src' +import duration from '../../src/plugin/duration' +import relativeTime from '../../src/plugin/relativeTime' +import '../../src/locale/fr' +import '../../src/locale/es' dayjs.extend(relativeTime) dayjs.extend(duration) @@ -16,6 +16,49 @@ afterEach(() => { MockDate.reset() }) +describe('Creating', () => { + it('milliseconds', () => { + expect(dayjs.duration(100).toISOString()).toBe('PT0.1S') + expect(dayjs.duration(1000).toISOString()).toBe('PT1S') + }) + it('two argument will bubble up to the next', () => { + expect(dayjs.duration(59, 'seconds').toISOString()).toBe('PT59S') + expect(dayjs.duration(60, 'seconds').toISOString()).toBe('P1M') + expect(dayjs.duration(13213, 'seconds').toISOString()).toBe('PT3H40M13S') + }) + it('object with float', () => { + expect(dayjs.duration({ + seconds: 1, + minutes: 2, + hours: 3, + days: 4, + months: 6, + years: 7 + }).toISOString()).toBe('P7Y6M4DT3H2M1S') + }) + it('object with weeks and float', () => { + expect(dayjs.duration({ + seconds: 1.1, + minutes: 2, + hours: 3, + days: 4, + weeks: 5, + months: 6, + years: 7 + }).toISOString()).toBe('P7Y6M39DT3H2M1.1S') + }) +}) + + +describe('Parse ISO string', () => { + it('Full ISO string', () => { + expect(dayjs.duration('P7Y6M4DT3H2M1S').toISOString()).toBe('P7Y6M4DT3H2M1S') + }) + it('Part ISO string', () => { + expect(dayjs.duration('PT2777H46M40S').toISOString()).toBe('PT2777H46M40S') + }) +}) + it('Is duration', () => { expect(dayjs.isDuration(dayjs.duration())).toBe(true) expect(dayjs.isDuration(dayjs.duration(1))).toBe(true) diff --git a/test/plugin/duration/creating.test.js b/test/plugin/duration/creating.test.js deleted file mode 100644 index 238a04f2b..000000000 --- a/test/plugin/duration/creating.test.js +++ /dev/null @@ -1,57 +0,0 @@ -import MockDate from 'mockdate' -import dayjs from '../../../src' -import duration from '../../../src/plugin/duration' - -dayjs.extend(duration) - -beforeEach(() => { - MockDate.set(new Date()) -}) - -afterEach(() => { - MockDate.reset() -}) - -describe('Creating', () => { - it('milliseconds', () => { - expect(dayjs.duration(100).toISOString()).toBe('PT0.1S') - expect(dayjs.duration(1000).toISOString()).toBe('PT1S') - }) - it('two argument will bubble up to the next', () => { - expect(dayjs.duration(59, 'seconds').toISOString()).toBe('PT59S') - expect(dayjs.duration(60, 'seconds').toISOString()).toBe('P1M') - expect(dayjs.duration(13213, 'seconds').toISOString()).toBe('PT3H40M13S') - }) - it('object with float', () => { - expect(dayjs.duration({ - seconds: 1, - minutes: 2, - hours: 3, - days: 4, - months: 6, - years: 7 - }).toISOString()).toBe('P7Y6M4DT3H2M1S') - }) - it('object with weeks and float', () => { - expect(dayjs.duration({ - seconds: 1.1, - minutes: 2, - hours: 3, - days: 4, - weeks: 5, - months: 6, - years: 7 - }).toISOString()).toBe('P7Y6M39DT3H2M1.1S') - }) -}) - - -describe('Parse ISO string', () => { - it('Full ISO string', () => { - expect(dayjs.duration('P7Y6M4DT3H2M1S').toISOString()).toBe('P7Y6M4DT3H2M1S') - }) - it('Part ISO string', () => { - expect(dayjs.duration('PT2777H46M40S').toISOString()).toBe('PT2777H46M40S') - }) -}) - From 47a847a49b22b58fec94e3c0ac4d6f5a10699107 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 13:18:37 +0800 Subject: [PATCH 35/42] add prettyUnit --- src/plugin/duration/index.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 6a0e84484..fecd85d2d 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -18,16 +18,19 @@ const unitToMS = { const isDuration = d => (d instanceof Duration) // eslint-disable-line no-use-before-define let $d +let $u const wrapper = (input, instance, unit) => new Duration(input, unit, instance.$l) // eslint-disable-line no-use-before-define +const prettyUnit = unit => `${$u.p(unit)}s` + class Duration { constructor(input, unit, locale) { this.$d = {} this.$l = locale || 'en' if (unit) { - return wrapper(input * unitToMS[unit], this) + return wrapper(input * unitToMS[prettyUnit(unit)], this) } if (typeof input === 'number') { this.$d.milliseconds = input @@ -94,15 +97,16 @@ class Duration { } as(unit) { - return this.$d.milliseconds / (unitToMS[unit] || 1) + return this.$d.milliseconds / (unitToMS[prettyUnit(unit)] || 1) } get(unit) { let base = this.$d.milliseconds - if (unit === 'milliseconds') { + const pUnit = prettyUnit(unit) + if (pUnit === 'milliseconds') { base %= 1000 } else { - base = Math.floor(base / unitToMS[unit]) + base = Math.floor(base / unitToMS[pUnit]) } return base } @@ -110,7 +114,7 @@ class Duration { add(input, unit, isSubtract) { let another = input // milliseconds number if (unit) { - another = input * unitToMS[unit] + another = input * unitToMS[prettyUnit(unit)] } else if (isDuration(input)) { another = input.$d.milliseconds } else if (typeof input === 'object') { @@ -156,6 +160,7 @@ class Duration { } export default (option, Dayjs, dayjs) => { $d = dayjs + $u = dayjs().$utils() dayjs.duration = function (input, unit) { return wrapper(input, {}, unit) } From af7d1ef01106bd0ca3b8fabbde612a729141f68a Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 13:21:45 +0800 Subject: [PATCH 36/42] add test --- test/plugin/duration.test.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js index 984db9e4d..1033cb695 100644 --- a/test/plugin/duration.test.js +++ b/test/plugin/duration.test.js @@ -160,3 +160,10 @@ describe('Years', () => { expect(dayjs.duration(100000000000).years()).toBe(3) expect(dayjs.duration(100000000000).asYears().toFixed(2)).toBe('3.17') }) + +describe('prettyUnit', () => { + const d = dayjs.duration(2, 's') + expect(d.toISOString()).toBe('PT2S') + expect(d.as('Second')).toBe(2) + expect(d.get('s')).toBe(2) +}) From a9d9287f5966922f85220d585876f4736008aa5a Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 13:23:48 +0800 Subject: [PATCH 37/42] add test --- src/plugin/duration/index.js | 2 +- test/plugin/duration.test.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index fecd85d2d..49d528d36 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -39,7 +39,7 @@ class Duration { } if (typeof input === 'object') { Object.keys(input).forEach((k) => { - this.$d[k] = input[k] + this.$d[prettyUnit(k)] = input[k] }) this.calMilliseconds() return this diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js index 1033cb695..d320be595 100644 --- a/test/plugin/duration.test.js +++ b/test/plugin/duration.test.js @@ -166,4 +166,8 @@ describe('prettyUnit', () => { expect(d.toISOString()).toBe('PT2S') expect(d.as('Second')).toBe(2) expect(d.get('s')).toBe(2) + expect(dayjs.duration({ + M: 12, + m: 12 + }).toISOString()).toBe('P12MT12M') }) From b366ef85dbfc5fed81148cd5e5c8c494bbcfbc03 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 13:45:12 +0800 Subject: [PATCH 38/42] add test --- src/plugin/duration/index.js | 8 +++++--- test/plugin/duration.test.js | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 49d528d36..341a50328 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -50,10 +50,11 @@ class Duration { [,, this.$d.years, this.$d.months,, this.$d.days, this.$d.hours, this.$d.minutes, this.$d.seconds] = d + this.calMilliseconds() + return this } - this.calMilliseconds() - return this } + return this } calMilliseconds() { @@ -89,7 +90,8 @@ class Duration { const m = this.$d.minutes ? `${this.$d.minutes}M` : '' const S = this.$d.seconds ? `${this.$d.seconds}S` : '' const T = (H || M || S) ? 'T' : '' - return `P${Y}${M}${D}${T}${H}${m}${S}` + const result = `P${Y}${M}${D}${T}${H}${m}${S}` + return result === 'P' ? 'P0D' : result } toJSON() { diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js index d320be595..811046d81 100644 --- a/test/plugin/duration.test.js +++ b/test/plugin/duration.test.js @@ -57,6 +57,9 @@ describe('Parse ISO string', () => { it('Part ISO string', () => { expect(dayjs.duration('PT2777H46M40S').toISOString()).toBe('PT2777H46M40S') }) + it('Invalid ISO string', () => { + expect(dayjs.duration('Invalid').toISOString()).toBe('P0D') + }) }) it('Is duration', () => { From 7e64788796ebbae73e7d0a0ff92e892e38b92bf8 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 13:53:16 +0800 Subject: [PATCH 39/42] add ms logic --- src/plugin/duration/index.js | 12 ++++++++---- test/plugin/duration.test.js | 5 +++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 341a50328..02c27ed5c 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -59,7 +59,7 @@ class Duration { calMilliseconds() { this.$d.milliseconds = Object.keys(this.$d).reduce((total, unit) => ( - total + ((this.$d[unit] || 0) * (unitToMS[unit] || 0)) + total + ((this.$d[unit] || 0) * (unitToMS[unit] || 1)) ), 0) } @@ -88,7 +88,11 @@ class Duration { const D = days ? `${days}D` : '' const H = this.$d.hours ? `${this.$d.hours}H` : '' const m = this.$d.minutes ? `${this.$d.minutes}M` : '' - const S = this.$d.seconds ? `${this.$d.seconds}S` : '' + let seconds = this.$d.seconds || 0 + if (this.$d.milliseconds) { + seconds += this.$d.milliseconds / 1000 + } + const S = seconds ? `${seconds}S` : '' const T = (H || M || S) ? 'T' : '' const result = `P${Y}${M}${D}${T}${H}${m}${S}` return result === 'P' ? 'P0D' : result @@ -114,12 +118,12 @@ class Duration { } add(input, unit, isSubtract) { - let another = input // milliseconds number + let another if (unit) { another = input * unitToMS[prettyUnit(unit)] } else if (isDuration(input)) { another = input.$d.milliseconds - } else if (typeof input === 'object') { + } else { another = wrapper(input, this).$d.milliseconds } return wrapper(this.$d.milliseconds + (another * (isSubtract ? -1 : 1)), this) diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js index 811046d81..41be206d0 100644 --- a/test/plugin/duration.test.js +++ b/test/plugin/duration.test.js @@ -47,6 +47,11 @@ describe('Creating', () => { years: 7 }).toISOString()).toBe('P7Y6M39DT3H2M1.1S') }) + it('object with millisecond', () => { + expect(dayjs.duration({ + ms: 1 + }).toISOString()).toBe('PT0.001S') + }) }) From d95e8acabac631e69b418622e71047a8d64ecf5f Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 14:00:39 +0800 Subject: [PATCH 40/42] add --- src/plugin/duration/index.js | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js index 02c27ed5c..835456b24 100644 --- a/src/plugin/duration/index.js +++ b/src/plugin/duration/index.js @@ -33,7 +33,7 @@ class Duration { return wrapper(input * unitToMS[prettyUnit(unit)], this) } if (typeof input === 'number') { - this.$d.milliseconds = input + this.$ms = input this.parseFromMilliseconds() return this } @@ -58,24 +58,24 @@ class Duration { } calMilliseconds() { - this.$d.milliseconds = Object.keys(this.$d).reduce((total, unit) => ( + this.$ms = Object.keys(this.$d).reduce((total, unit) => ( total + ((this.$d[unit] || 0) * (unitToMS[unit] || 1)) ), 0) } parseFromMilliseconds() { - let { milliseconds } = this.$d - this.$d.years = Math.floor(milliseconds / MILLISECONDS_A_YEAR) - milliseconds %= MILLISECONDS_A_YEAR - this.$d.months = Math.floor(milliseconds / MILLISECONDS_A_MONTH) - milliseconds %= MILLISECONDS_A_MONTH - this.$d.days = Math.floor(milliseconds / MILLISECONDS_A_DAY) - milliseconds %= MILLISECONDS_A_DAY - this.$d.hours = Math.floor(milliseconds / MILLISECONDS_A_HOUR) - milliseconds %= MILLISECONDS_A_HOUR - this.$d.minutes = Math.floor(milliseconds / MILLISECONDS_A_MINUTE) - milliseconds %= MILLISECONDS_A_MINUTE - this.$d.seconds = milliseconds / MILLISECONDS_A_SECOND + let { $ms } = this + this.$d.years = Math.floor($ms / MILLISECONDS_A_YEAR) + $ms %= MILLISECONDS_A_YEAR + this.$d.months = Math.floor($ms / MILLISECONDS_A_MONTH) + $ms %= MILLISECONDS_A_MONTH + this.$d.days = Math.floor($ms / MILLISECONDS_A_DAY) + $ms %= MILLISECONDS_A_DAY + this.$d.hours = Math.floor($ms / MILLISECONDS_A_HOUR) + $ms %= MILLISECONDS_A_HOUR + this.$d.minutes = Math.floor($ms / MILLISECONDS_A_MINUTE) + $ms %= MILLISECONDS_A_MINUTE + this.$d.seconds = $ms / MILLISECONDS_A_SECOND } toISOString() { @@ -103,11 +103,11 @@ class Duration { } as(unit) { - return this.$d.milliseconds / (unitToMS[prettyUnit(unit)] || 1) + return this.$ms / (unitToMS[prettyUnit(unit)] || 1) } get(unit) { - let base = this.$d.milliseconds + let base = this.$ms const pUnit = prettyUnit(unit) if (pUnit === 'milliseconds') { base %= 1000 @@ -122,11 +122,11 @@ class Duration { if (unit) { another = input * unitToMS[prettyUnit(unit)] } else if (isDuration(input)) { - another = input.$d.milliseconds + another = input.$ms } else { - another = wrapper(input, this).$d.milliseconds + another = wrapper(input, this).$ms } - return wrapper(this.$d.milliseconds + (another * (isSubtract ? -1 : 1)), this) + return wrapper(this.$ms + (another * (isSubtract ? -1 : 1)), this) } subtract(input, unit) { @@ -140,11 +140,11 @@ class Duration { } clone() { - return wrapper(this.$d.milliseconds, this) + return wrapper(this.$ms, this) } humanize(withSuffix) { - return $d().add(this.$d.milliseconds, 'ms').locale(this.$l).fromNow(!withSuffix) + return $d().add(this.$ms, 'ms').locale(this.$l).fromNow(!withSuffix) } milliseconds() { return this.get('milliseconds') } From 5770f04f8db4bd2710a282fa92d4eef18f016468 Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 14:21:50 +0800 Subject: [PATCH 41/42] add type --- types/plugin/duration.d.ts | 52 +++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/types/plugin/duration.d.ts b/types/plugin/duration.d.ts index 7b9d54775..174346c43 100644 --- a/types/plugin/duration.d.ts +++ b/types/plugin/duration.d.ts @@ -3,6 +3,56 @@ import { PluginFunc } from 'dayjs' declare const plugin: PluginFunc export = plugin +export type DurationInputType = string | number | object +export type DurationAddType = number | object | Duration + +class Duration { + constructor (input: DurationInputType, unit?: string, locale?: string) + + clone(): Duration + + humanize(withSuffix: boolean): string + + milliseconds(): number + asMilliseconds(): number + + seconds(): number + asSeconds(): number + + minutes(): number + asMinutes(): number + + hours(): number + asHours(): number + + days(): number + asDays(): number + + weeks(): number + asWeeks(): number + + months(): number + asMonths(): number + + years(): number + asYears(): number + + as(unit: string): number + + get(unit: string): number + + add(input: DurationAddType, unit? : string): Duration + + subtract(input: DurationAddType, unit? : string): Duration + + toJSON(): string + + toISOString(): string + + locale(locale: string): Duration +} + declare module 'dayjs' { - export function duration(input: any): any + export function duration(input: DurationInputType , unit?: string): Duration + export function isDuration(d: any): d is Duration } From 55a931ad377a2b917e65c18d217c38eb50cc4efe Mon Sep 17 00:00:00 2001 From: iamkun Date: Wed, 8 Apr 2020 14:29:18 +0800 Subject: [PATCH 42/42] add type --- types/plugin/duration.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/types/plugin/duration.d.ts b/types/plugin/duration.d.ts index 174346c43..38225c922 100644 --- a/types/plugin/duration.d.ts +++ b/types/plugin/duration.d.ts @@ -3,10 +3,10 @@ import { PluginFunc } from 'dayjs' declare const plugin: PluginFunc export = plugin -export type DurationInputType = string | number | object -export type DurationAddType = number | object | Duration +type DurationInputType = string | number | object +type DurationAddType = number | object | Duration -class Duration { +declare class Duration { constructor (input: DurationInputType, unit?: string, locale?: string) clone(): Duration @@ -53,6 +53,6 @@ class Duration { } declare module 'dayjs' { - export function duration(input: DurationInputType , unit?: string): Duration + export function duration(input?: DurationInputType , unit?: string): Duration export function isDuration(d: any): d is Duration }