diff --git a/README.md b/README.md index 74aaec7d..53dfcbba 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,11 @@ export interface IUtils { startOfWeek(value: TDate): TDate; endOfWeek(value: TDate): TDate; + addSeconds(value: TDate, count: number): TDate; + addMinutes(value: TDate, count: number): TDate; + addHours(value: TDate, count: number): TDate; addDays(value: TDate, count: number): TDate; + addWeeks(value: TDate, count: number): TDate; addMonths(value: TDate, count: number): TDate; startOfDay(value: TDate): TDate; diff --git a/__tests__/calculations.test.ts b/__tests__/calculations.test.ts index 50e32b1e..e1f7f584 100644 --- a/__tests__/calculations.test.ts +++ b/__tests__/calculations.test.ts @@ -24,8 +24,29 @@ describe("DateTime calculations", () => { expect(utils.isValid("2018-42-30T11:60:00.000Z")).toBeFalsy(); }); + utilsTest("addSeconds", (date, utils, lib) => { + expect(utils.format(utils.addSeconds(date, 65), "seconds")).toBe("05"); + expect(utils.format(utils.addSeconds(date, -5), "seconds")).toBe("55"); + }); + + utilsTest("addMinutes", (date, utils, lib) => { + expect(utils.format(utils.addMinutes(date, 65), "minutes")).toBe("49"); + expect(utils.format(utils.addMinutes(date, -5), "minutes")).toBe("39"); + }); + + utilsTest("addHours", (date, utils, lib) => { + expect(utils.format(utils.addHours(date, 65), "hours24h")).toBe("04"); + expect(utils.format(utils.addHours(date, -5), "hours24h")).toBe("06"); + }); + utilsTest("addDays", (date, utils, lib) => { expect(utils.format(utils.addDays(date, 1), "dayOfMonth")).toBe("31"); + expect(utils.format(utils.addDays(date, -1), "dayOfMonth")).toBe("29"); + }); + + utilsTest("addWeeks", (date, utils, lib) => { + expect(utils.getDiff(utils.addWeeks(date, 1), date, "weeks")).toBe(1); + expect(utils.getDiff(utils.addWeeks(date, -1), date, "weeks")).toBe(-1); }); utilsTest("addMonths", (date, utils, lib) => { diff --git a/__tests__/date-fns-jalali.test.ts b/__tests__/date-fns-jalali.test.ts index f4e45e86..8be38710 100644 --- a/__tests__/date-fns-jalali.test.ts +++ b/__tests__/date-fns-jalali.test.ts @@ -32,8 +32,29 @@ describe("DateFnsJalali", () => { expect(utils.isValid("2018-42-30T11:60:00.000Z")).toBeFalsy(); }); + it("DateFnsJalali -- addSeconds", () => { + expect(utils.format(utils.addSeconds(date, 65), "seconds")).toBe("05"); + expect(utils.format(utils.addSeconds(date, -5), "seconds")).toBe("55"); + }); + + it("DateFnsJalali -- addMinutes", () => { + expect(utils.format(utils.addMinutes(date, 65), "minutes")).toBe("49"); + expect(utils.format(utils.addMinutes(date, -5), "minutes")).toBe("39"); + }); + + it("DateFnsJalali -- addHours", () => { + expect(utils.format(utils.addHours(date, 65), "hours24h")).toBe("04"); + expect(utils.format(utils.addHours(date, -5), "hours24h")).toBe("06"); + }); + it("DateFnsJalali -- addDays", () => { expect(utils.format(utils.addDays(date, 1), "dayOfMonth")).toBe("9"); + expect(utils.format(utils.addDays(date, -1), "dayOfMonth")).toBe("7"); + }); + + it("DateFnsJalali -- addWeeks", () => { + expect(utils.getDiff(utils.addWeeks(date, 1), date, "weeks")).toBe(1); + expect(utils.getDiff(utils.addWeeks(date, -1), date, "weeks")).toBe(-1); }); it("DateFnsJalali -- addMonths", () => { diff --git a/packages/core/IUtils.d.ts b/packages/core/IUtils.d.ts index b5f5a13c..7bcc7103 100644 --- a/packages/core/IUtils.d.ts +++ b/packages/core/IUtils.d.ts @@ -114,7 +114,11 @@ export interface IUtils { startOfWeek(value: TDate): TDate; endOfWeek(value: TDate): TDate; + addSeconds(value: TDate, count: number): TDate; + addMinutes(value: TDate, count: number): TDate; + addHours(value: TDate, count: number): TDate; addDays(value: TDate, count: number): TDate; + addWeeks(value: TDate, count: number): TDate; addMonths(value: TDate, count: number): TDate; startOfDay(value: TDate): TDate; diff --git a/packages/date-fns-jalali/src/date-fns-jalali-utils.ts b/packages/date-fns-jalali/src/date-fns-jalali-utils.ts index df6665ae..28cf7c1e 100644 --- a/packages/date-fns-jalali/src/date-fns-jalali-utils.ts +++ b/packages/date-fns-jalali/src/date-fns-jalali-utils.ts @@ -1,4 +1,8 @@ +import addSeconds from "date-fns-jalali/addSeconds"; +import addMinutes from "date-fns-jalali/addMinutes"; +import addHours from "date-fns-jalali/addHours"; import addDays from "date-fns-jalali/addDays"; +import addWeeks from "date-fns-jalali/addWeeks"; import addMonths from "date-fns-jalali/addMonths"; import addYears from "date-fns-jalali/addYears"; import differenceInYears from "date-fns/differenceInYears"; @@ -137,10 +141,26 @@ export default class DateFnsJalaliUtils implements IUtils { return this.locale?.code || "fa-jalali-IR"; } + public addSeconds(value: Date, count: number) { + return addSeconds(value, count); + } + + public addMinutes(value: Date, count: number) { + return addMinutes(value, count); + } + + public addHours(value: Date, count: number) { + return addHours(value, count); + } + public addDays(value: Date, count: number) { return addDays(value, count); } + public addWeeks(value: Date, count: number) { + return addWeeks(value, count); + } + public addMonths(value: Date, count: number) { return addMonths(value, count); } diff --git a/packages/date-fns/src/date-fns-utils.ts b/packages/date-fns/src/date-fns-utils.ts index eaceb07f..ac2fc8aa 100644 --- a/packages/date-fns/src/date-fns-utils.ts +++ b/packages/date-fns/src/date-fns-utils.ts @@ -1,4 +1,8 @@ import addDays from "date-fns/addDays"; +import addSeconds from "date-fns/addSeconds"; +import addMinutes from "date-fns/addMinutes"; +import addHours from "date-fns/addHours"; +import addWeeks from "date-fns/addWeeks"; import addMonths from "date-fns/addMonths"; import addYears from "date-fns/addYears"; import differenceInYears from "date-fns/differenceInYears"; @@ -122,10 +126,26 @@ export default class DateFnsUtils implements IUtils { return this.locale?.code || "en-US"; } + public addSeconds(value: Date, count: number) { + return addSeconds(value, count); + } + + public addMinutes(value: Date, count: number) { + return addMinutes(value, count); + } + + public addHours(value: Date, count: number) { + return addHours(value, count); + } + public addDays(value: Date, count: number) { return addDays(value, count); } + public addWeeks(value: Date, count: number) { + return addWeeks(value, count); + } + public addMonths(value: Date, count: number) { return addMonths(value, count); } diff --git a/packages/dayjs/src/dayjs-utils.ts b/packages/dayjs/src/dayjs-utils.ts index ef786a68..d297f3b2 100644 --- a/packages/dayjs/src/dayjs-utils.ts +++ b/packages/dayjs/src/dayjs-utils.ts @@ -181,10 +181,30 @@ export default class DayjsUtils implements IUtils { return date.hour(); } + public addSeconds(date: Dayjs, count: number) { + return count < 0 + ? date.subtract(Math.abs(count), "second") + : date.add(count, "second"); + } + + public addMinutes(date: Dayjs, count: number) { + return count < 0 + ? date.subtract(Math.abs(count), "minute") + : date.add(count, "minute"); + } + + public addHours(date: Dayjs, count: number) { + return count < 0 ? date.subtract(Math.abs(count), "hour") : date.add(count, "hour"); + } + public addDays(date: Dayjs, count: number) { return count < 0 ? date.subtract(Math.abs(count), "day") : date.add(count, "day"); } + public addWeeks(date: Dayjs, count: number) { + return count < 0 ? date.subtract(Math.abs(count), "week") : date.add(count, "week"); + } + public addMonths(date: Dayjs, count: number) { return count < 0 ? date.subtract(Math.abs(count), "month") : date.add(count, "month"); } diff --git a/packages/luxon/src/luxon-utils.ts b/packages/luxon/src/luxon-utils.ts index 2f231c17..7416f714 100644 --- a/packages/luxon/src/luxon-utils.ts +++ b/packages/luxon/src/luxon-utils.ts @@ -97,10 +97,34 @@ export default class LuxonUtils implements IUtils { return this.locale || Settings.defaultLocale; } + public addSeconds(date: DateTime, count: number) { + return count < 0 + ? date.minus({ seconds: Math.abs(count) }) + : date.plus({ seconds: count }); + } + + public addMinutes(date: DateTime, count: number) { + return count < 0 + ? date.minus({ minutes: Math.abs(count) }) + : date.plus({ minutes: count }); + } + + public addHours(date: DateTime, count: number) { + return count < 0 + ? date.minus({ hours: Math.abs(count) }) + : date.plus({ hours: count }); + } + public addDays(date: DateTime, count: number) { return count < 0 ? date.minus({ days: Math.abs(count) }) : date.plus({ days: count }); } + public addWeeks(date: DateTime, count: number) { + return count < 0 + ? date.minus({ weeks: Math.abs(count) }) + : date.plus({ weeks: count }); + } + public addMonths(date: DateTime, count: number) { return count < 0 ? date.minus({ months: Math.abs(count) }) diff --git a/packages/moment/src/moment-utils.ts b/packages/moment/src/moment-utils.ts index 53cc7430..1fee7a8b 100644 --- a/packages/moment/src/moment-utils.ts +++ b/packages/moment/src/moment-utils.ts @@ -166,12 +166,36 @@ export default class MomentUtils implements IUtils { return date.get("hours"); } + public addSeconds(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "seconds") + : date.clone().add(count, "seconds"); + } + + public addMinutes(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "minutes") + : date.clone().add(count, "minutes"); + } + + public addHours(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "hours") + : date.clone().add(count, "hours"); + } + public addDays(date: Moment, count: number) { return count < 0 ? date.clone().subtract(Math.abs(count), "days") : date.clone().add(count, "days"); } + public addWeeks(date: Moment, count: number) { + return count < 0 + ? date.clone().subtract(Math.abs(count), "weeks") + : date.clone().add(count, "weeks"); + } + public addMonths(date: Moment, count: number) { return count < 0 ? date.clone().subtract(Math.abs(count), "months")