// Human-readable date/time formatting shared across chrono components export function formatTime(date: Date): string { return date.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' }) } export function formatEpochTime(timestamp: number): string { return formatTime(new Date(timestamp)) } export function formatHour(hour: number): string { const ampm = hour >= 12 ? 'PM' : 'AM' const displayHour = hour % 12 || 12 return `${displayHour} ${ampm}` } export function formatWeekDay(date: Date): string { return date.toLocaleDateString('en-US', { weekday: 'short' }) } export function formatFullDate(date: Date | string): string { const value = date instanceof Date ? date : new Date(date) return value.toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', }) } // Local-time YYYY-MM-DD, for date input values export function formatLocalIsoDate(date: Date): string { const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') return `${year}-${month}-${day}` } // Local-time HH:MM, for time input values export function formatLocalIsoTime(date: Date): string { return date.toTimeString().slice(0, 5) } // "Jul 6, 2026" from a YYYY-MM-DD (or ISO) string export function formatDisplayDate(value: string | null | undefined): string { if (!value) return '' return new Date(`${value.slice(0, 10)}T00:00:00`).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric', }) } // "1:05 PM" from an HH:MM string export function formatDisplayTime(value: string | null | undefined): string { if (!value) return '' const [hour, minute] = value.split(':').map(Number) const date = new Date() date.setHours(hour, minute, 0, 0) return date.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' }) }