/** * Format an ISO date string (YYYY-MM-DD) for display. * Uses T12:00:00 to avoid UTC timezone off-by-one when converting to local time. */ export function formatDate(isoDate: string): string { return new Intl.DateTimeFormat('de-DE', { day: 'numeric', month: 'long', year: 'numeric' }).format(new Date(isoDate + 'T12:00:00')); } /** * Converts an ISO date string (YYYY-MM-DD) to German display format (DD.MM.YYYY). * Returns an empty string for invalid or empty input. */ export function isoToGerman(iso: string): string { if (!iso || !/^\d{4}-\d{2}-\d{2}$/.test(iso)) return ''; const [y, m, d] = iso.split('-'); return `${d}.${m}.${y}`; } /** * Converts a German date string (DD.MM.YYYY) to ISO format (YYYY-MM-DD). * Returns an empty string for invalid or empty input. */ export function germanToIso(german: string): string { const match = german.match(/^(\d{2})\.(\d{2})\.(\d{4})$/); if (!match) return ''; const [, d, m, y] = match; return `${y}-${m}-${d}`; } /** * Handles a date input event for German-format date fields (DD.MM.YYYY). * Strips non-digits, formats with dots, mutates the input's displayed value, * and returns the display string and its ISO equivalent. */ export function handleGermanDateInput(e: Event): { display: string; iso: string } { const input = e.target as HTMLInputElement; const digits = input.value.replace(/\D/g, '').slice(0, 8); let display: string; if (digits.length <= 2) { display = digits; } else if (digits.length <= 4) { display = `${digits.slice(0, 2)}.${digits.slice(2)}`; } else { display = `${digits.slice(0, 2)}.${digits.slice(2, 4)}.${digits.slice(4)}`; } input.value = display; return { display, iso: germanToIso(display) }; }