![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.quebec/private_html/node_modules/@wojtekmaj/date-utils/src/ |
type DateLike = Date | number | string;
/**
* Utils
*/
function makeGetEdgeOfNeighbor<T>(
getPeriod: (date: T) => number,
getEdgeOfPeriod: (date: number) => Date,
defaultOffset: number,
) {
return function makeGetEdgeOfNeighborInternal(date: T, offset: number = defaultOffset) {
const previousPeriod = getPeriod(date) + offset;
return getEdgeOfPeriod(previousPeriod);
};
}
function makeGetEnd<T>(getBeginOfNextPeriod: (date: T) => Date) {
return function makeGetEndInternal(date: T) {
return new Date(getBeginOfNextPeriod(date).getTime() - 1);
};
}
function makeGetRange<T>(getStart: (date: T) => Date, getEnd: (date: T) => Date) {
return function makeGetRangeInternal(date: T): [Date, Date] {
return [getStart(date), getEnd(date)];
};
}
/**
* Simple getters - getting a property of a given point in time
*/
/**
* Gets year from a given date.
*
* @param {DateLike} date Date to get year from
* @returns {number} Year
*/
export function getYear(date: DateLike): number {
if (date instanceof Date) {
return date.getFullYear();
}
if (typeof date === 'number') {
return date;
}
const year = Number.parseInt(date, 10);
if (typeof date === 'string' && !Number.isNaN(year)) {
return year;
}
throw new Error(`Failed to get year from date: ${date}.`);
}
/**
* Gets month from a given date.
*
* @param {Date} date Date to get month from
* @returns {number} Month
*/
export function getMonth(date: Date): number {
if (date instanceof Date) {
return date.getMonth();
}
throw new Error(`Failed to get month from date: ${date}.`);
}
/**
* Gets human-readable month from a given date.
*
* @param {Date} date Date to get human-readable month from
* @returns {number} Human-readable month
*/
export function getMonthHuman(date: Date): number {
if (date instanceof Date) {
return date.getMonth() + 1;
}
throw new Error(`Failed to get human-readable month from date: ${date}.`);
}
/**
* Gets day of the month from a given date.
*
* @param {Date} date Date to get day of the month from
* @returns {number} Day of the month
*/
export function getDate(date: Date): number {
if (date instanceof Date) {
return date.getDate();
}
throw new Error(`Failed to get year from date: ${date}.`);
}
/**
* Gets hours from a given date.
*
* @param {Date | string} date Date to get hours from
* @returns {number} Hours
*/
export function getHours(date: Date | string): number {
if (date instanceof Date) {
return date.getHours();
}
if (typeof date === 'string') {
const datePieces = date.split(':');
if (datePieces.length >= 2) {
const hoursString = datePieces[0];
if (hoursString) {
const hours = Number.parseInt(hoursString, 10);
if (!Number.isNaN(hours)) {
return hours;
}
}
}
}
throw new Error(`Failed to get hours from date: ${date}.`);
}
/**
* Gets minutes from a given date.
*
* @param {Date | string} date Date to get minutes from
* @returns {number} Minutes
*/
export function getMinutes(date: Date | string): number {
if (date instanceof Date) {
return date.getMinutes();
}
if (typeof date === 'string') {
const datePieces = date.split(':');
if (datePieces.length >= 2) {
const minutesString = datePieces[1] || '0';
const minutes = Number.parseInt(minutesString, 10);
if (!Number.isNaN(minutes)) {
return minutes;
}
}
}
throw new Error(`Failed to get minutes from date: ${date}.`);
}
/**
* Gets seconds from a given date.
*
* @param {Date | string} date Date to get seconds from
* @returns {number} Seconds
*/
export function getSeconds(date: Date | string): number {
if (date instanceof Date) {
return date.getSeconds();
}
if (typeof date === 'string') {
const datePieces = date.split(':');
if (datePieces.length >= 2) {
const secondsWithMillisecondsString = datePieces[2] || '0';
const seconds = Number.parseInt(secondsWithMillisecondsString, 10);
if (!Number.isNaN(seconds)) {
return seconds;
}
}
}
throw new Error(`Failed to get seconds from date: ${date}.`);
}
/**
* Gets milliseconds from a given date.
*
* @param {Date | string} date Date to get milliseconds from
* @returns {number} Milliseconds
*/
export function getMilliseconds(date: Date | string): number {
if (date instanceof Date) {
return date.getMilliseconds();
}
if (typeof date === 'string') {
const datePieces = date.split(':');
if (datePieces.length >= 2) {
const secondsWithMillisecondsString = datePieces[2] || '0';
const millisecondsString = secondsWithMillisecondsString.split('.')[1] || '0';
const milliseconds = Number.parseInt(millisecondsString, 10);
if (!Number.isNaN(milliseconds)) {
return milliseconds;
}
}
}
throw new Error(`Failed to get seconds from date: ${date}.`);
}
/**
* Century
*/
/**
* Gets century start date from a given date.
*
* @param {DateLike} date Date to get century start from
* @returns {Date} Century start date
*/
export function getCenturyStart(date: DateLike): Date {
const year = getYear(date);
const centuryStartYear = year + ((-year + 1) % 100);
const centuryStartDate = new Date();
centuryStartDate.setFullYear(centuryStartYear, 0, 1);
centuryStartDate.setHours(0, 0, 0, 0);
return centuryStartDate;
}
/**
* Gets previous century start date from a given date.
*
* @param {DateLike} date Date to get previous century start from
* @param {number} [offset=-100] Offset in years to calculate previous century start from
* @returns {Date} Previous century start date
*/
export const getPreviousCenturyStart: (date: DateLike, offset?: number) => Date =
makeGetEdgeOfNeighbor(getYear, getCenturyStart, -100);
/**
* Gets next century start date from a given date.
*
* @param {DateLike} date Date to get next century start from
* @param {number} [offset=100] Offset in years to calculate next century start from
* @returns {Date} Next century start date
*/
export const getNextCenturyStart: (date: DateLike, offset?: number) => Date = makeGetEdgeOfNeighbor(
getYear,
getCenturyStart,
100,
);
/**
* Gets century end date from a given date.
*
* @param {DateLike} date Date to get century end from
* @returns {Date} Century end date
*/
export const getCenturyEnd: (date: DateLike) => Date = makeGetEnd(getNextCenturyStart);
/**
* Gets previous century end date from a given date.
*
* @param {DateLike} date Date to get previous century end from
* @param {number} [offset=-100] Offset in years to calculate previous century end from
* @returns {Date} Previous century end date
*/
export const getPreviousCenturyEnd: (date: DateLike, offset?: number) => Date =
makeGetEdgeOfNeighbor(getYear, getCenturyEnd, -100);
/**
* Gets next century end date from a given date.
*
* @param {DateLike} date Date to get next century end from
* @param {number} [offset=100] Offset in years to calculate next century end from
* @returns {Date} Next century end date
*/
export const getNextCenturyEnd: (date: DateLike, offset?: number) => Date = makeGetEdgeOfNeighbor(
getYear,
getCenturyEnd,
100,
);
/**
* Gets century start and end dates from a given date.
*
* @param {DateLike} date Date to get century start and end from
* @returns {[Date, Date]} Century start and end dates
*/
export const getCenturyRange: (date: DateLike) => [Date, Date] = makeGetRange(
getCenturyStart,
getCenturyEnd,
);
/**
* Decade
*/
/**
* Gets decade start date from a given date.
*
* @param {DateLike} date Date to get decade start from
* @returns {Date} Decade start date
*/
export function getDecadeStart(date: DateLike): Date {
const year = getYear(date);
const decadeStartYear = year + ((-year + 1) % 10);
const decadeStartDate = new Date();
decadeStartDate.setFullYear(decadeStartYear, 0, 1);
decadeStartDate.setHours(0, 0, 0, 0);
return decadeStartDate;
}
/**
* Gets previous decade start date from a given date.
*
* @param {DateLike} date Date to get previous decade start from
* @param {number} [offset=-10] Offset in years to calculate previous decade start from
* @returns {Date} Previous decade start date
*/
export const getPreviousDecadeStart: (date: DateLike, offset?: number) => Date =
makeGetEdgeOfNeighbor(getYear, getDecadeStart, -10);
/**
* Gets next decade start date from a given date.
*
* @param {DateLike} date Date to get next decade start from
* @param {number} [offset=10] Offset in years to calculate next decade start from
* @returns {Date} Next decade start date
*/
export const getNextDecadeStart: (date: DateLike, offset?: number) => Date = makeGetEdgeOfNeighbor(
getYear,
getDecadeStart,
10,
);
/**
* Gets decade end date from a given date.
*
* @param {DateLike} date Date to get decade end from
* @returns {Date} Decade end date
*/
export const getDecadeEnd: (date: DateLike) => Date = makeGetEnd(getNextDecadeStart);
/**
* Gets previous decade end date from a given date.
*
* @param {DateLike} date Date to get previous decade end from
* @param {number} [offset=-10] Offset in years to calculate previous decade end from
* @returns {Date} Previous decade end date
*/
export const getPreviousDecadeEnd: (date: DateLike, offset?: number) => Date =
makeGetEdgeOfNeighbor(getYear, getDecadeEnd, -10);
/**
* Gets next decade end date from a given date.
*
* @param {DateLike} date Date to get next decade end from
* @param {number} [offset=10] Offset in years to calculate next decade end from
* @returns {Date} Next decade end date
*/
export const getNextDecadeEnd: (date: DateLike, offset?: number) => Date = makeGetEdgeOfNeighbor(
getYear,
getDecadeEnd,
10,
);
/**
* Gets decade start and end dates from a given date.
*
* @param {DateLike} date Date to get decade start and end from
* @returns {[Date, Date]} Decade start and end dates
*/
export const getDecadeRange: (date: DateLike) => [Date, Date] = makeGetRange(
getDecadeStart,
getDecadeEnd,
);
/**
* Year
*/
/**
* Gets year start date from a given date.
*
* @param {DateLike} date Date to get year start from
* @returns {Date} Year start date
*/
export function getYearStart(date: DateLike): Date {
const year = getYear(date);
const yearStartDate = new Date();
yearStartDate.setFullYear(year, 0, 1);
yearStartDate.setHours(0, 0, 0, 0);
return yearStartDate;
}
/**
* Gets previous year start date from a given date.
*
* @param {DateLike} date Date to get previous year start from
* @param {number} [offset=-1] Offset in years to calculate previous year start from
* @returns {Date} Previous year start date
*/
export const getPreviousYearStart: (date: DateLike, offset?: number) => Date =
makeGetEdgeOfNeighbor(getYear, getYearStart, -1);
/**
* Gets next year start date from a given date.
*
* @param {DateLike} date Date to get next year start from
* @param {number} [offset=1] Offset in years to calculate next year start from
* @returns {Date} Next year start date
*/
export const getNextYearStart: (date: DateLike, offset?: number) => Date = makeGetEdgeOfNeighbor(
getYear,
getYearStart,
1,
);
/**
* Gets year end date from a given date.
*
* @param {DateLike} date Date to get year end from
* @returns {Date} Year end date
*/
export const getYearEnd: (date: DateLike) => Date = makeGetEnd(getNextYearStart);
/**
* Gets previous year end date from a given date.
*
* @param {DateLike} date Date to get previous year end from
* @param {number} [offset=-1] Offset in years to calculate previous year end from
* @returns {Date} Previous year end date
*/
export const getPreviousYearEnd: (date: DateLike, offset?: number) => Date = makeGetEdgeOfNeighbor(
getYear,
getYearEnd,
-1,
);
/**
* Gets next year end date from a given date.
*
* @param {DateLike} date Date to get next year end from
* @param {number} [offset=1] Offset in years to calculate next year end from
* @returns {Date} Next year end date
*/
export const getNextYearEnd: (date: DateLike, offset?: number) => Date = makeGetEdgeOfNeighbor(
getYear,
getYearEnd,
1,
);
/**
* Gets year start and end dates from a given date.
*
* @param {DateLike} date Date to get year start and end from
* @returns {[Date, Date]} Year start and end dates
*/
export const getYearRange: (date: DateLike) => [Date, Date] = makeGetRange(
getYearStart,
getYearEnd,
);
/**
* Month
*/
function makeGetEdgeOfNeighborMonth(getEdgeOfPeriod: (date: Date) => Date, defaultOffset: number) {
return function makeGetEdgeOfNeighborMonthInternal(date: Date, offset: number = defaultOffset) {
const year = getYear(date);
const month = getMonth(date) + offset;
const previousPeriod = new Date();
previousPeriod.setFullYear(year, month, 1);
previousPeriod.setHours(0, 0, 0, 0);
return getEdgeOfPeriod(previousPeriod);
};
}
/**
* Gets month start date from a given date.
*
* @param {DateLike} date Date to get month start from
* @returns {Date} Month start date
*/
export function getMonthStart(date: Date): Date {
const year = getYear(date);
const month = getMonth(date);
const monthStartDate = new Date();
monthStartDate.setFullYear(year, month, 1);
monthStartDate.setHours(0, 0, 0, 0);
return monthStartDate;
}
/**
* Gets previous month start date from a given date.
*
* @param {Date} date Date to get previous month start from
* @param {number} [offset=-1] Offset in months to calculate previous month start from
* @returns {Date} Previous month start date
*/
export const getPreviousMonthStart: (date: Date, offset?: number) => Date =
makeGetEdgeOfNeighborMonth(getMonthStart, -1);
/**
* Gets next month start date from a given date.
*
* @param {Date} date Date to get next month start from
* @param {number} [offset=1] Offset in months to calculate next month start from
* @returns {Date} Next month start date
*/
export const getNextMonthStart: (date: Date, offset?: number) => Date = makeGetEdgeOfNeighborMonth(
getMonthStart,
1,
);
/**
* Gets month end date from a given date.
*
* @param {Date} date Date to get month end from
* @returns {Date} Month end date
*/
export const getMonthEnd: (date: Date) => Date = makeGetEnd(getNextMonthStart);
/**
* Gets previous month end date from a given date.
*
* @param {Date} date Date to get previous month end from
* @param {number} [offset=-1] Offset in months to calculate previous month end from
* @returns {Date} Previous month end date
*/
export const getPreviousMonthEnd: (date: Date, offset?: number) => Date =
makeGetEdgeOfNeighborMonth(getMonthEnd, -1);
/**
* Gets next month end date from a given date.
*
* @param {Date} date Date to get next month end from
* @param {number} [offset=1] Offset in months to calculate next month end from
* @returns {Date} Next month end date
*/
export const getNextMonthEnd: (date: Date, offset?: number) => Date = makeGetEdgeOfNeighborMonth(
getMonthEnd,
1,
);
/**
* Gets month start and end dates from a given date.
*
* @param {Date} date Date to get month start and end from
* @returns {[Date, Date]} Month start and end dates
*/
export const getMonthRange: (date: Date) => [Date, Date] = makeGetRange(getMonthStart, getMonthEnd);
/**
* Day
*/
function makeGetEdgeOfNeighborDay(getEdgeOfPeriod: (date: Date) => Date, defaultOffset: number) {
return function makeGetEdgeOfNeighborDayInternal(date: Date, offset: number = defaultOffset) {
const year = getYear(date);
const month = getMonth(date);
const day = getDate(date) + offset;
const previousPeriod = new Date();
previousPeriod.setFullYear(year, month, day);
previousPeriod.setHours(0, 0, 0, 0);
return getEdgeOfPeriod(previousPeriod);
};
}
/**
* Gets day start date from a given date.
*
* @param {DateLike} date Date to get day start from
* @returns {Date} Day start date
*/
export function getDayStart(date: Date): Date {
const year = getYear(date);
const month = getMonth(date);
const day = getDate(date);
const dayStartDate = new Date();
dayStartDate.setFullYear(year, month, day);
dayStartDate.setHours(0, 0, 0, 0);
return dayStartDate;
}
/**
* Gets previous day start date from a given date.
*
* @param {Date} date Date to get previous day start from
* @param {number} [offset=-1] Offset in days to calculate previous day start from
* @returns {Date} Previous day start date
*/
export const getPreviousDayStart: (date: Date, offset?: number) => Date = makeGetEdgeOfNeighborDay(
getDayStart,
-1,
);
/**
* Gets next day start date from a given date.
*
* @param {Date} date Date to get next day start from
* @param {number} [offset=1] Offset in days to calculate next day start from
* @returns {Date} Next day start date
*/
export const getNextDayStart: (date: Date, offset?: number) => Date = makeGetEdgeOfNeighborDay(
getDayStart,
1,
);
/**
* Gets day end date from a given date.
*
* @param {Date} date Date to get day end from
* @returns {Date} Day end date
*/
export const getDayEnd: (date: Date) => Date = makeGetEnd(getNextDayStart);
/**
* Gets previous day end date from a given date.
*
* @param {DateLike} date Date to get previous day end from
* @param {number} [offset=-1] Offset in days to calculate previous day end from
* @returns {Date} Previous day end date
*/
export const getPreviousDayEnd: (date: Date, offset?: number) => Date = makeGetEdgeOfNeighborDay(
getDayEnd,
-1,
);
/**
* Gets next day end date from a given date.
*
* @param {DateLike} date Date to get next day end from
* @param {number} [offset=1] Offset in days to calculate next day end from
* @returns {Date} Next day end date
*/
export const getNextDayEnd: (date: Date, offset?: number) => Date = makeGetEdgeOfNeighborDay(
getDayEnd,
1,
);
/**
* Gets day start and end dates from a given date.
*
* @param {DateLike} date Date to get day start and end from
* @returns {[Date, Date]} Day start and end dates
*/
export const getDayRange: (date: Date) => [Date, Date] = makeGetRange(getDayStart, getDayEnd);
/**
* Other
*/
/**
* Returns a number of days in a month of a given date.
*
* @param {Date} date Date
* @returns {number} Number of days in a month
*/
export function getDaysInMonth(date: Date): number {
return getDate(getMonthEnd(date));
}
function padStart(num: string | number, val = 2) {
const numStr = `${num}`;
if (numStr.length >= val) {
return num;
}
return `0000${numStr}`.slice(-val);
}
/**
* Returns local hours and minutes (hh:mm).
*
* @param {Date | string} date Date to get hours and minutes from
* @returns {string} Local hours and minutes
*/
export function getHoursMinutes(date: Date | string): string {
const hours = padStart(getHours(date));
const minutes = padStart(getMinutes(date));
return `${hours}:${minutes}`;
}
/**
* Returns local hours, minutes and seconds (hh:mm:ss).
*
* @param {Date | string} date Date to get hours, minutes and seconds from
* @returns {string} Local hours, minutes and seconds
*/
export function getHoursMinutesSeconds(date: Date | string): string {
const hours = padStart(getHours(date));
const minutes = padStart(getMinutes(date));
const seconds = padStart(getSeconds(date));
return `${hours}:${minutes}:${seconds}`;
}
/**
* Returns local month in ISO-like format (YYYY-MM).
*
* @param {Date} date Date to get month in ISO-like format from
* @returns {string} Local month in ISO-like format
*/
export function getISOLocalMonth(date: Date): string {
const year = padStart(getYear(date), 4);
const month = padStart(getMonthHuman(date));
return `${year}-${month}`;
}
/**
* Returns local date in ISO-like format (YYYY-MM-DD).
*
* @param {Date} date Date to get date in ISO-like format from
* @returns {string} Local date in ISO-like format
*/
export function getISOLocalDate(date: Date): string {
const year = padStart(getYear(date), 4);
const month = padStart(getMonthHuman(date));
const day = padStart(getDate(date));
return `${year}-${month}-${day}`;
}
/**
* Returns local date & time in ISO-like format (YYYY-MM-DDThh:mm:ss).
*
* @param {Date} date Date to get date & time in ISO-like format from
* @returns {string} Local date & time in ISO-like format
*/
export function getISOLocalDateTime(date: Date): string {
return `${getISOLocalDate(date)}T${getHoursMinutesSeconds(date)}`;
}