feat: enhance pedimento date validation and update date handling in forms
This commit is contained in:
75
frontend/src/lib/date-utils.ts
Normal file
75
frontend/src/lib/date-utils.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
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')}`;
|
||||
}
|
||||
Reference in New Issue
Block a user