Skip to content

Dates

Adds calendar days using UTC math. Datetime inputs preserve datetime output; date-only inputs return date-only output.

export function addDays(date: string, days: number): ISODateString;

export function subtractDays(date: string, days: number): ISODateString;

export function addHours(date: string, hours: number): ISODateTimeString;

export function addMinutes(date: string, minutes: number): ISODateTimeString;

export function addMonths(date: string, months: number): ISODateString;

export function diffInDays(startDate: string, endDate: string): number;

export function diffInCalendarDays(startDate: string, endDate: string): number;

Returns the Gantt duration between two task dates. Date-only ranges are inclusive; datetime ranges use elapsed days and keep a non-zero positive duration at one minute minimum.

export function diffInTaskDuration(startDate: string, endDate: string): number;

export function diffInHours(startDate: string, endDate: string): number;

export function diffInMinutes(startDate: string, endDate: string): number;

export function compareIsoDates(left: string, right: string): number;

export function isBefore(left: string, right: string): boolean;

export function isAfter(left: string, right: string): boolean;

export function minDate(left: string, right: string): ISODateString;

export function maxDate(left: string, right: string): ISODateString;

export function shiftDate(date: string, deltaDays: number): ISODateString;

export function shiftDateRange<T extends ISODateRange>(range: T, deltaDays: number): T;

export function shiftDateRanges<T extends ISODateRange>(
ranges: readonly T[] | undefined,
deltaDays: number,
): readonly T[] | undefined;

export function startOfWeek(date: string): ISODateString;

export function startOfMonth(date: string): ISODateString;

export function startOfQuarter(date: string): ISODateString;

export function startOfYear(date: string): ISODateString;

Returns the UTC Monday for the week containing date.

export function getWeekStartIsoDate(date: Date): ISODateString;

export function getMonthStartIsoDate(date: Date): ISODateString;

export function getIsoWeekNumber(date: Date): number;

export function todayIsoDate(): ISODateString;

Returns an inclusive date list and throws when the range is invalid.

export function createDateList(
startDate: string,
endDate: string,
options:;

Returns an inclusive date list or [] for invalid input. Use this when remote/user data should not throw during projection.

export function createSafeDateList(startDate: string, endDate: string): readonly ISODateString[];

Tests overlap for half-open numeric ranges: [start, end) and [rangeStart, rangeEnd).

export function rangesOverlap(start: number, end: number, rangeStart: number, rangeEnd: number): boolean;

Returns the UTC midnight timestamp for the date containing value.

export function startOfUtcDayMs(value: string | number | Date): number;

Returns the half-open UTC day bounds [startMs, endMs) for a date.

export function getDateDayBounds(date: string):;

Returns half-open UTC bounds for an inclusive date range.

export function getDateRangeBounds(range: ISODateBoundsRange):;

MINUTE_IN_MS: number;

HOUR_IN_MS: number;

DAY_IN_MS: number;

WEEK_IN_MS: number;

MINUTE_IN_DAYS: number;

interface ISODateRange {
readonly startDate: ISODateString;
readonly endDate: ISODateString
}

interface ISODateBoundsRange {
readonly start: string;
readonly end: string
}

export function resolveDurationSettings(
settings: DurationSettings | undefined,
calendar?: Pick<CalendarEntity, 'hoursPerDay' | 'workingDays'> | null,
): ResolvedDurationSettings;

export function parseDuration(
input: unknown,
options?: ParseDurationOptions,
): ParsedDuration | null;

Returns true when text explicitly contains a unit rather than a bare number.

export function hasDurationUnitToken(input: unknown): boolean;

export function durationToWorkingDays(
value: number,
unit: DurationUnit,
settings: ResolvedDurationSettings,
): number;

Converts a displayed duration magnitude into canonical stored working hours.

export function durationToHours(
value: number,
unit: DurationUnit,
settings: ResolvedDurationSettings,
): number;

export function workingDaysToDuration(
workingDays: number,
unit: DurationUnit,
settings: ResolvedDurationSettings,
): number;

Converts canonical stored working hours into a display magnitude.

export function hoursToDuration(
hours: number,
unit: DurationUnit,
settings: ResolvedDurationSettings,
): number;

Converts an elapsed duration to continuous 24-hour calendar days.

export function durationToElapsedDays(value: number, unit: DurationUnit): number;

Converts an elapsed display magnitude into canonical stored continuous hours.

export function durationToElapsedHours(value: number, unit: DurationUnit): number;

export function elapsedDaysToDuration(elapsedDays: number, unit: DurationUnit): number;

Converts canonical stored continuous hours into an elapsed display magnitude.

export function elapsedHoursToDuration(elapsedHours: number, unit: DurationUnit): number;

export function resolveAutomaticDurationUnit(
workingDays: number,
settings: ResolvedDurationSettings,
): DurationUnit;

Selects the automatic display unit for a canonical working-hour value.

export function resolveAutomaticDurationUnitFromHours(
hours: number,
settings: ResolvedDurationSettings,
): DurationUnit;

export function formatDurationValue(
value: number,
unit: DurationUnit,
options?: FormatDurationValueOptions,
): string;

export function formatWorkingDuration(
workingDays: number,
settings: ResolvedDurationSettings,
options?: FormatWorkingDurationOptions,
): string;

Unit retained with an authored task duration.

/** Unit retained with an authored task duration. */
export type DurationUnit = 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';

Project-level duration display and working-time conversion settings.

interface DurationSettings {
/** Unit used for bare input and display. `auto` chooses minutes, hours, or days by magnitude. */
readonly defaultUnit?: DurationUnit | 'auto';
/** Unit used for bare Work input and display. Defaults to `auto`, independently from task Duration. */
readonly defaultWorkUnit?: DurationUnit | 'auto';
/** Working hours represented by one duration day. Defaults to the effective calendar, then 8. */
readonly hoursPerDay?: number;
/** Working hours represented by one duration week. Defaults to the effective workweek, then 40. */
readonly hoursPerWeek?: number;
/** Working days represented by one duration month. Defaults to 20. */
readonly daysPerMonth?: number;
/** Maximum digits shown after the decimal separator. Defaults to 1. */
readonly maximumFractionDigits?: number
}

interface ResolvedDurationSettings {
readonly defaultUnit: DurationUnit | 'auto';
readonly defaultWorkUnit: DurationUnit | 'auto';
readonly hoursPerDay: number;
readonly hoursPerWeek: number;
readonly daysPerMonth: number;
readonly maximumFractionDigits: number
}

interface ParsedDuration {
readonly value: number;
readonly unit: DurationUnit;
readonly elapsed: boolean
}

interface ParseDurationOptions {
readonly defaultUnit?: DurationUnit;
readonly allowElapsed?: boolean
}

interface FormatDurationValueOptions {
readonly elapsed?: boolean;
/** Maximum digits shown after the decimal separator. Defaults to 1. */
readonly maximumFractionDigits?: number
}

FormatWorkingDurationOptions (Extended from duration.ts)

Section titled “FormatWorkingDurationOptions (Extended from duration.ts)”
interface FormatWorkingDurationOptions {
readonly unit?: DurationUnit
}

Parses date-only strings at UTC midnight instead of local midnight. Datetime strings are delegated to the JavaScript Date parser.

export function parseIsoDate(date: string): Date;

Parses the YYYY-MM-DD prefix of a date or datetime at UTC midnight.

export function parseIsoDateOnly(value: string): Date;

export function isIsoDateTimeInput(value: string): boolean;

export function getIsoWeekdayUtc(date: Date): number;

export function getUtcWeekday(value: string | Date): number;

export function getIsoWeekday(value: string | Date): number;

export function isValidIsoWeekday(value: number): boolean;

export function formatIsoDate(date: Date): ISODateString;

Serializes the local calendar fields of a valid Date as YYYY-MM-DD.

export function formatLocalIsoDate(value: Date): ISODateString;

Returns local calendar fields as YYYY-MM-DD, or null for a missing/invalid date.

export function toLocalIsoDate(value: Date | undefined): ISODateString | null;

export function formatIsoDateTime(date: Date): ISODateTimeString;

export function isValidIsoDate(value: string | undefined): value is ISODateString;

export function isValidIsoDateTime(value: string | undefined): value is ISODateTimeString;

Validates either a date-only ISO value or a UTC datetime value. Date-only values must round-trip as YYYY-MM-DD; datetimes must round-trip exactly through toISOString().

export function isValidIsoDateValue(value: string | undefined): value is ISODateString;

Returns a valid YYYY-MM-DD value or throws with a user-facing message.

export function normalizeIsoDate(value: string): ISODateString;

Parses scheduler datetime input as UTC. Values without a trailing Z are treated as UTC, not local time.

export function parseDateTime(value: string): Date;

export function toISODate(date: Date): ISODateString;

export function toIsoDate(date: Date): ISODateString;

export type ISODateString = `${number}-${number}-${number}` | `${number}-${number}-${number}T${string}`;

export type ISODateTimeString = `${number}-${number}-${number}T${string}`;

ISO_DATE_ONLY_PATTERN: RegExp;

ISO_DATE_PATTERN: RegExp;

ISO_DATE_PREFIX_PATTERN: RegExp;

ISO_DATETIME_PATTERN: RegExp;

ISO_DATETIME_INPUT_PATTERN: RegExp;

ISO_LOCAL_DATETIME_INPUT_PATTERN: RegExp;

ISO_UTC_DATETIME_WITHOUT_ZONE_PATTERN: RegExp;

Parses HH:mm or h:mm AM/PM into minutes from midnight. 24:00 is accepted only when allowEndOfDay is enabled.

export function parseTimeOfDay(value: string, options:;

export function formatTimeOfDay(totalMinutes: number): string;

export function formatCompactTimeOfDay(totalMinutes: number): string;

export function formatAmPmTimeOfDay(totalMinutes: number): string;

export function formatDisplayTimeOfDay(
totalMinutes: number,
options:;

export function formatDurationMinutes(totalMinutes: number): string;

export function formatDuration(
duration: number | undefined | null,
options:;

export function hasAmPmMarker(value: string): boolean;

export function getDateMinutes(date: Date): number;

Creates a UTC datetime from a date-only value and minutes since midnight.

export function createDateTime(date: string, minutes: number): ISODateTimeString;

export function createDateTimeFromTimeOfDay(date: string, time: string, dayOffset = 0): ISODateTimeString;

Serializes a local Date clock value as a UTC ISO datetime. This preserves the user’s local wall-clock fields for scheduler form inputs.

export function getLocalDateTimeAsUtcIsoDateTime(date: Date): ISODateTimeString;

export function shiftDateTime(value: string, deltaMinutes: number): ISODateTimeString;

export function getDateTimeDurationMinutes(startDateTime: string, endDateTime: string): number;

export function getDurationMinutes(event:;

Returns an event duration in minutes, clamped to zero for inverted ranges.

export function getClampedDateTimeDurationMinutes(startDateTime: string, endDateTime: string): number;

export function snapMinutes(minutes: number, snap: number): number;

Snaps a UTC datetime to the nearest minute interval within the same UTC day.

export function snapDateTime(value: string, snap: number): ISODateTimeString;

export function normalizeTimelineWeekStartsOn(value: unknown): TimelineWeekStartsOn;

export function startOfTimelineWeek(date: string, weekStartsOn: TimelineWeekStartsOn): ISODateString;

Parses a timeline boundary as UTC for deterministic scale math.

export function parseTimelineDateValue(date: string): Date;

Returns the UTC-aligned start for a timeline unit. Intraday units preserve datetime precision; day and larger units return date-only values.

export function startOfTimelineUnit(
unit: TimelineUnit,
date: string,
weekStartsOn: TimelineWeekStartsOn = 0,
): ISODateString | ISODateTimeString;

Adds a timeline unit while preserving the timeline’s UTC normalization rules.

export function addTimelineUnit(
unit: TimelineUnit,
date: string,
amount: number,
): ISODateString | ISODateTimeString;

Converts an inclusive Gantt date boundary to an exclusive timeline boundary. Datetime values already represent instants and are returned unchanged.

export function getTimelineEndExclusiveDate(date: string): ISODateString | ISODateTimeString;

export function getTimelineQuarter(date: string): number;

Formats timeline labels in UTC so headers do not drift by local timezone.

export function formatTimelineDateLabel(
date: string,
locale: string,
options: Intl.DateTimeFormatOptions,
): string;

export function startOfHour(date: string): ISODateTimeString;

export function startOfMinute(date: string): ISODateTimeString;

export type TimelineUnit = 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';

export type TimelineWeekStartsOn = 0 | 1;

Checks a date against calendar working weekdays and holiday exclusions.

export function isWorkingDate(
date: ISODateString,
calendar: WorkingCalendar | null | undefined,
): boolean;

Moves forward until a working date is found. Returns the original date when no working date is found before iterationLimit.

export function moveToNextWorkingDate(
date: ISODateString,
calendar: WorkingCalendar | null | undefined,
iterationLimit = 3660,
): ISODateString;

export function moveToNextWorkingDateTime(
date: ISODateString,
calendar: WorkingCalendar | null | undefined,
iterationLimit = 3660,
): ISODateString;

Moves backward until a working date is found. Returns the original date when no working date is found before iterationLimit.

export function moveToPreviousWorkingDate(
date: ISODateString,
calendar: WorkingCalendar | null | undefined,
iterationLimit = 3660,
): ISODateString;

Adds working days, excluding the start date from the counted offset.

export function addWorkingDays(
startDate: ISODateString,
days: number,
calendar: WorkingCalendar | null | undefined,
): ISODateString;

Subtracts working days, excluding the start date from the counted offset.

export function subtractWorkingDays(
startDate: ISODateString,
days: number,
calendar: WorkingCalendar | null | undefined,
): ISODateString;

Applies dependency lag using either calendar days or working days.

export function offsetByLagCalendar(
date: ISODateString,
days: number,
calendar: WorkingCalendar | null | undefined,
options: LagCalendarOptions,
): ISODateString;

Resolves a task end date from start and duration. Date-only durations are inclusive; datetime durations support fractional days.

export function resolveTaskEndDate(
startDate: ISODateString,
duration: number,
calendar: WorkingCalendar | null | undefined,
options: WorkingDayOptions,
): ISODateString;

Resolves a task start date from end and duration. Date-only durations are inclusive; datetime durations support fractional days.

export function resolveTaskStartDateFromEnd(
endDate: ISODateString,
duration: number,
calendar: WorkingCalendar | null | undefined,
options: WorkingDayOptions,
): ISODateString;

Counts working dates inclusively between start and end.

export function countWorkingDaysInclusive(
startDate: ISODateString,
endDate: ISODateString,
calendar: WorkingCalendar | null | undefined,
): number;

export function countWorkingDuration(
startDate: ISODateString,
endDate: ISODateString,
calendar: WorkingCalendar | null | undefined,
): number;

Snaps a date to the nearest working date in the requested direction. Returns the original date when no working date is found before iterationLimit.

export function snapToWorkingDate(
date: ISODateString,
calendar: WorkingCalendar | null | undefined,
direction: 'forward' | 'back' = 'forward',
iterationLimit = 366,
): ISODateString;

interface WorkingTimeRange {
readonly start: string;
readonly end: string
}

interface WorkingCalendar {
readonly workingDays: readonly number[];
readonly holidays: readonly string[];
readonly workingHours?: WorkingTimeRange | readonly WorkingTimeRange[];
readonly hoursPerDay?: number
}

interface WorkingDayOptions {
readonly excludeHolidaysFromDuration: boolean
}

interface LagCalendarOptions {
readonly lagCalendar: 'calendar-days' | 'working-days'
}