/** 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
}