Files
plantillas-proyectos/frontend/src/lib/date-utils.ts

79 lines
2.5 KiB
TypeScript

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);
// Convertir a objeto Date nativo de JavaScript para obtener ISO string correcto
const jsDate = new Date(zonedDateTime.toString());
return jsDate.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);
const zonedDate = fromDate(dateObj, localTimeZone);
return `${zonedDate.year}-${String(zonedDate.month).padStart(2, '0')}-${String(zonedDate.day).padStart(2, '0')}`;
}
// 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')}`;
}