Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/environment

src/date.ts

36 lines · 1.2 KB · TypeScript
/** Default timezone used to resolve relative dates like "today". */
export const defaultLocationTimeZone = 'UTC'

export function calendarDateInTimeZone(date: Date, timeZone: string): string {
	return new Intl.DateTimeFormat('en-CA', {
		timeZone,
		year: 'numeric',
		month: '2-digit',
		day: '2-digit',
	}).format(date)
}

export function addCalendarDays(calendarDate: string, days: number): string {
	const parts = calendarDate.split('-').map(Number)
	const shifted = new Date(Date.UTC(parts[0], parts[1] - 1, parts[2] + days))
	const year = shifted.getUTCFullYear()
	const month = String(shifted.getUTCMonth() + 1).padStart(2, '0')
	const day = String(shifted.getUTCDate()).padStart(2, '0')
	return year + '-' + month + '-' + day
}

/** Resolve "today" / "tomorrow" / "yesterday" / explicit YYYY-MM-DD input to a calendar date. */
export function resolveDate(
	input: unknown,
	now: Date = new Date(),
	timeZone: string = defaultLocationTimeZone,
): string {
	const value = String(input || '')
		.trim()
		.toLowerCase()
	const today = calendarDateInTimeZone(now, timeZone)
	if (!value || value === 'today') return today
	if (value === 'tomorrow') return addCalendarDays(today, 1)
	if (value === 'yesterday') return addCalendarDays(today, -1)
	return value
}