diff --git a/CHANGELOG.md b/CHANGELOG.md index 404e8c0..6845c49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- `getStartOfDay`, `getEndOfDay` and `getLastDayOfYear` date utility functions + ## [1.1.0] - 2024-10-17 - export `boolean` utilities diff --git a/src/lib/date.spec.ts b/src/lib/date.spec.ts index 605e124..c942105 100644 --- a/src/lib/date.spec.ts +++ b/src/lib/date.spec.ts @@ -6,6 +6,9 @@ import { dateIsWeekend, dateDifferenceInDays, getNextBusinessDate, + getStartOfDay, + getEndOfDay, + getLastDayOfYear, } from "./date"; describe("date tests", () => { @@ -106,6 +109,41 @@ describe("date tests", () => { [42 as unknown as Date, new Date(Number.NaN)], ["test" as unknown as Date, new Date(Number.NaN)], ])("getNextBusinessDate", (date, expected) => { - expect(getNextBusinessDate(date).getDate()).toBe(expected.getDate()); + expect(getNextBusinessDate(date).getTime()).toBe(expected.getTime()); + }); + + test.each([ + [new Date(2024, 0, 1, 12, 45, 25, 333), new Date(2024, 0, 1, 0, 0, 0, 0)], + [null as unknown as Date, new Date(Number.NaN)], + [undefined as unknown as Date, new Date(Number.NaN)], + [42 as unknown as Date, new Date(Number.NaN)], + ["test" as unknown as Date, new Date(Number.NaN)], + ])("getStartOfDay", (date, expected) => { + expect(getStartOfDay(date).getTime()).toBe(expected.getTime()); + }); + + test.each([ + [new Date(2024, 0, 1, 12, 45, 25, 333), new Date(2024, 0, 1, 23, 59, 59, 999)], + [null as unknown as Date, new Date(Number.NaN)], + [undefined as unknown as Date, new Date(Number.NaN)], + [42 as unknown as Date, new Date(Number.NaN)], + ["test" as unknown as Date, new Date(Number.NaN)], + ])("getEndOfDay", (date, expected) => { + expect(getEndOfDay(date).getTime()).toBe(expected.getTime()); + }); + + test.each([ + [null as unknown as Date, new Date(Number.NaN)], + [undefined as unknown as Date, new Date(Number.NaN)], + [42 as unknown as Date, new Date(Number.NaN)], + ["test" as unknown as Date, new Date(Number.NaN)], + ])("getLastDayOfYear", (date, expected) => { + expect(getLastDayOfYear(date).getTime()).toBe(expected.getTime()); + }); + + test("getLastDayOfYear all days", () => { + for (let date = new Date(2024, 0, 1); date < new Date(2025, 0, 1); date.setDate(date.getDate() + 1)) { + expect(getLastDayOfYear(date).getTime()).toBe(new Date(2024, 11, 31, 0, 0, 0, 0).getTime()); + } }); }); diff --git a/src/lib/date.ts b/src/lib/date.ts index fa6277b..c185ca7 100644 --- a/src/lib/date.ts +++ b/src/lib/date.ts @@ -7,6 +7,9 @@ import { isWeekend, differenceInCalendarDays, addBusinessDays, + startOfDay, + endOfDay, + lastDayOfYear, } from "date-fns"; /** @@ -73,3 +76,30 @@ export function dateDifferenceInDays(from: Date, to: Date): number { export function getNextBusinessDate(date: Date): Date { return dateIsValid(date) ? addBusinessDays(date, 1) : new Date(Number.NaN); } + +/** + * Get the start of a day for the given date + * @param date The date + * @returns The start of a day date + */ +export function getStartOfDay(date: Date): Date { + return dateIsValid(date) ? startOfDay(date) : new Date(Number.NaN); +} + +/** + * Get the end of a day for the given date + * @param date The date + * @returns The end of a day date + */ +export function getEndOfDay(date: Date): Date { + return dateIsValid(date) ? endOfDay(date) : new Date(Number.NaN); +} + +/** + * Get the last day of a year for the given date + * @param date The date + * @returns The last day of the date year + */ +export function getLastDayOfYear(date: Date): Date { + return dateIsValid(date) ? lastDayOfYear(date) : new Date(Number.NaN); +}