79 lines
2.5 KiB
TypeScript
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')}`;
|
|
}
|