// Timezone-aware datetime utilities (similar to your Python datetime_utils.py) /** * Get current time in configured timezone */ export function nowTz(): Date { return new Date() } /** * Calculate days until a target date */ export function daysUntil(target: Date | string): number { const targetDate = typeof target === 'string' ? new Date(target) : target const now = new Date() const diffTime = targetDate.getTime() - now.getTime() return Math.floor(diffTime / (1000 * 60 * 60 * 24)) } /** * Calculate hours until a target date */ export function hoursUntil(target: Date | string): number { const targetDate = typeof target === 'string' ? new Date(target) : target const now = new Date() const diffTime = targetDate.getTime() - now.getTime() return diffTime / (1000 * 60 * 60) } /** * Check if current time is within a window around target time * @param target Target datetime * @param windowMinutes Window size in minutes (default: 60) * @returns True if now is between [target - window, target + window] */ export function isWithinWindow(target: Date | string, windowMinutes: number = 60): boolean { const targetDate = typeof target === 'string' ? new Date(target) : target const now = new Date() const diffMs = Math.abs(now.getTime() - targetDate.getTime()) return diffMs <= windowMinutes * 60 * 1000 } /** * Add hours to a date */ export function addHours(date: Date | string, hours: number): Date { const d = typeof date === 'string' ? new Date(date) : new Date(date) d.setHours(d.getHours() + hours) return d } /** * Add days to a date */ export function addDays(date: Date | string, days: number): Date { const d = typeof date === 'string' ? new Date(date) : new Date(date) d.setDate(d.getDate() + days) return d } /** * Format date for display with timezone */ export function formatDateTz(date: Date | string | null | undefined, options?: Intl.DateTimeFormatOptions): string { if (!date) return 'N/A' const d = typeof date === 'string' ? new Date(date) : date return d.toLocaleString('en-US', { timeZone: process.env.NEXT_PUBLIC_TIMEZONE || 'America/New_York', ...options, }) } /** * Check if a date is in the past */ export function isPast(date: Date | string): boolean { const d = typeof date === 'string' ? new Date(date) : date return d.getTime() < Date.now() } /** * Check if a date is in the future */ export function isFuture(date: Date | string): boolean { return !isPast(date) } /** * Get start of day for a date */ export function startOfDay(date: Date | string): Date { const d = typeof date === 'string' ? new Date(date) : new Date(date) d.setHours(0, 0, 0, 0) return d } /** * Get end of day for a date */ export function endOfDay(date: Date | string): Date { const d = typeof date === 'string' ? new Date(date) : new Date(date) d.setHours(23, 59, 59, 999) return d }