diff --git a/README.md b/README.md index 8ec9ae96..4e3f8cc3 100644 --- a/README.md +++ b/README.md @@ -179,6 +179,7 @@ export interface IUtils { addDays(value: TDate, count: number): TDate; addWeeks(value: TDate, count: number): TDate; addMonths(value: TDate, count: number): TDate; + addYears(value: TDate, count: number): TDate; startOfDay(value: TDate): TDate; endOfDay(value: TDate): TDate; diff --git a/__tests__/calculations.test.ts b/__tests__/calculations.test.ts index d7df795a..8d73d418 100644 --- a/__tests__/calculations.test.ts +++ b/__tests__/calculations.test.ts @@ -54,6 +54,11 @@ describe("DateTime calculations", () => { expect(utils.format(utils.addMonths(date, -2), "monthAndYear")).toBe("August 2018"); }); + utilsTest("addYears", (date, utils, lib) => { + expect(utils.format(utils.addYears(date, 2), "year")).toBe("2020"); + expect(utils.format(utils.addYears(date, -2), "year")).toBe("2016"); + }); + utilsTest("startOfDay", (date, utils, lib) => { expect(utils.formatByString(utils.startOfDay(date), formats.dateTime[lib])).toBe( "2018-10-30 00:00" diff --git a/__tests__/date-fns-jalali.test.ts b/__tests__/date-fns-jalali.test.ts index c7fb1388..88099eb3 100644 --- a/__tests__/date-fns-jalali.test.ts +++ b/__tests__/date-fns-jalali.test.ts @@ -62,6 +62,11 @@ describe("DateFnsJalali", () => { expect(utils.format(utils.addMonths(date, -2), "monthAndYear")).toBe("شهریور 1397"); }); + it("DateFnsJalali -- addYears", () => { + expect(utils.format(utils.addYears(date, 2), "year")).toBe("1399"); + expect(utils.format(utils.addYears(date, -2), "year")).toBe("1395"); + }); + it("DateFnsJalali -- startOfDay", () => { expect(utils.formatByString(utils.startOfDay(date), dateTimeFormat)).toBe( "1397/08/08 00:00" diff --git a/__tests__/local-date-calculations.test.ts b/__tests__/local-date-calculations.test.ts index 2a364020..f761c666 100644 --- a/__tests__/local-date-calculations.test.ts +++ b/__tests__/local-date-calculations.test.ts @@ -37,6 +37,11 @@ describe("DateTime calculations", () => { expect(utils.format(utils.addMonths(date, -2), "monthAndYear")).toBe("August 2018"); }); + localDateutilsTest("addYears", (date, utils, lib) => { + expect(utils.format(utils.addYears(date, 2), "year")).toBe("2020"); + expect(utils.format(utils.addYears(date, -2), "year")).toBe("2016"); + }); + localDateutilsTest("startOfDay", (date, utils, lib) => { expect(utils.formatByString(utils.startOfDay(date), formats.dateTime[lib])).toBe( "2018-10-30 00:00" diff --git a/packages/core/IUtils.d.ts b/packages/core/IUtils.d.ts index 23092b11..bd41f19f 100644 --- a/packages/core/IUtils.d.ts +++ b/packages/core/IUtils.d.ts @@ -122,6 +122,7 @@ export interface IUtils { addDays(value: TDate, count: number): TDate; addWeeks(value: TDate, count: number): TDate; addMonths(value: TDate, count: number): TDate; + addYears(value: TDate, count: number): TDate; startOfDay(value: TDate): TDate; endOfDay(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 11d36a89..429a8453 100644 --- a/packages/date-fns-jalali/src/date-fns-jalali-utils.ts +++ b/packages/date-fns-jalali/src/date-fns-jalali-utils.ts @@ -168,6 +168,10 @@ export default class DateFnsJalaliUtils implements IUtils { return addMonths(value, count); }; + public addYears = (value: Date, count: number) => { + return addYears(value, count); + }; + public isValid = (value: any) => { return isValid(this.date(value)); }; diff --git a/packages/date-fns/src/date-fns-utils.ts b/packages/date-fns/src/date-fns-utils.ts index e5509464..9603c5f0 100644 --- a/packages/date-fns/src/date-fns-utils.ts +++ b/packages/date-fns/src/date-fns-utils.ts @@ -161,6 +161,10 @@ export default class DateFnsUtils implements IUtils { return addMonths(value, count); }; + public addYears = (value: Date, count: number) => { + return addYears(value, count); + }; + public isValid = (value: any) => { return isValid(this.date(value)); }; diff --git a/packages/dayjs/src/dayjs-utils.ts b/packages/dayjs/src/dayjs-utils.ts index 3c35508c..181ccaf0 100644 --- a/packages/dayjs/src/dayjs-utils.ts +++ b/packages/dayjs/src/dayjs-utils.ts @@ -221,6 +221,12 @@ export default class DayjsUtils implements IUtils { + return count < 0 + ? (date.subtract(Math.abs(count), "year") as TDate) + : (date.add(count, "year") as TDate); + }; + public setMonth = (date: Dayjs, count: number) => { return date.set("month", count) as TDate; }; diff --git a/packages/js-joda/src/js-joda-utils.ts b/packages/js-joda/src/js-joda-utils.ts index 4d8c0bba..d6960b27 100644 --- a/packages/js-joda/src/js-joda-utils.ts +++ b/packages/js-joda/src/js-joda-utils.ts @@ -509,6 +509,10 @@ export default class JsJodaUtils implements IUtils { return value.plus(count, ChronoUnit.MONTHS); } + addYears(value: Temporal, count: number): Temporal { + return value.plus(count, ChronoUnit.YEARS); + } + addSeconds(value: Temporal, count: number): Temporal { return value.plus(count, ChronoUnit.SECONDS); } diff --git a/packages/luxon/src/luxon-utils.ts b/packages/luxon/src/luxon-utils.ts index 12f9b2e5..b00b2a19 100644 --- a/packages/luxon/src/luxon-utils.ts +++ b/packages/luxon/src/luxon-utils.ts @@ -129,6 +129,10 @@ export default class LuxonUtils implements IUtils { return date.plus({ months: count }); }; + public addYears = (date: DateTime, count: number) => { + return date.plus({ years: count }); + }; + public isValid = (value: any) => { if (value instanceof DateTime) { return value.isValid; diff --git a/packages/moment/src/moment-utils.ts b/packages/moment/src/moment-utils.ts index 8c13be58..393beb96 100644 --- a/packages/moment/src/moment-utils.ts +++ b/packages/moment/src/moment-utils.ts @@ -210,6 +210,12 @@ export default class MomentUtils implements IUtils { : date.clone().add(count, "months"); }; + public addYears = (date: Moment, count: number) => { + return count < 0 + ? date.clone().subtract(Math.abs(count), "years") + : date.clone().add(count, "years"); + }; + public setHours = (date: Moment, count: number) => { return date.clone().hours(count); };