import { getLocalTimeZone, parseDate, parseTime, toCalendarDateTime, fromDate, now, today } from '@internationalized/date'; const localTimeZone = getLocalTimeZone(); /** * Convierte fecha local (string input YYYY-MM-DD) + hora (HH:MM) a UTC ISO string. * Útil para enviar datos al backend que espera timestamps absolutos. */ export function prepareDateForBackend(dateStr: string, timeStr: string = '00:00'): string | null { if (!dateStr) return null; try { const date = parseDate(dateStr); const time = parseTime(timeStr); // Combinar fecha y hora usando la zona horaria local const dateTime = toCalendarDateTime(date, time); const zonedDateTime = dateTime.toDate(localTimeZone); return zonedDateTime.toISOString(); } catch (e) { console.error('Error parsing date:', e); return null; } } /** * Convertir fechas que vienen del servidor (ISO UTC) a fecha local del calendario (YYYY-MM-DD string). * Útil para poblar inputs type="date". */ export function loadServerDate(isoStr: string | null | undefined): string { if (!isoStr) return ''; try { // Si incluye T es ISO completo, convertir a zona local if (isoStr.includes('T')) { const dateObj = new Date(isoStr); return fromDate(dateObj, localTimeZone).toString(); } // Si no, asumir fecha plana YYYY-MM-DD return isoStr.substring(0, 10); } catch { return isoStr || ''; } } /** * Sumar días de forma segura con calendario y devolver string YYYY-MM-DD. */ export function addDaysLocal(dateStr: string, days: number): string { if (!dateStr) return ''; try { return parseDate(dateStr).add({ days }).toString(); } catch { return ''; } } export function getCurrentLocalYear(): string { const nowZoned = now(localTimeZone); return String(nowZoned.year).slice(-2); } export function getCurrentLocalDate(): string { return today(localTimeZone).toString(); } export function getCurrentLocalTime(): string { const nowZoned = now(localTimeZone); return `${String(nowZoned.hour).padStart(2, '0')}:${String(nowZoned.minute).padStart(2, '0')}`; }