Manejo correcto de fecha y hora con Claude Code
Aprende sobre el manejo correcto de fecha y hora usando Claude Code. Incluye ejemplos de codigo practicos.
Implementando correctamente el procesamiento de fecha y hora con Claude Code
El procesamiento de fechas y horas es un area con muchas trampas inesperadas, como zonas horarias, formato y soporte de locales. Con Claude Code, puedes implementar eficientemente un manejo robusto de fechas siguiendo las mejores practicas.
Seleccion de biblioteca
> Crea utilidades de procesamiento de fecha y hora.
> Usa day.js e implementa conversion de zona horaria, visualizacion de tiempo relativo,
> formato en espanol y calculo de dias habiles.
- day.js: Ligero (2KB) con API compatible con Moment.js
- date-fns: Basado en funciones, ideal para tree-shaking
- Temporal API: Futura API estandar (aun en fase de propuesta)
Implementacion de utilidades de fecha
// src/lib/date-utils.ts
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
import relativeTime from 'dayjs/plugin/relativeTime';
import 'dayjs/locale/es';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(relativeTime);
dayjs.locale('es');
// Zona horaria por defecto
const DEFAULT_TZ = 'Europe/Madrid';
// Presets de formato
export const DATE_FORMATS = {
full: 'D [de] MMMM [de] YYYY (ddd) HH:mm',
date: 'D [de] MMMM [de] YYYY',
dateShort: 'D/M',
time: 'HH:mm',
iso: 'YYYY-MM-DDTHH:mm:ssZ',
api: 'YYYY-MM-DD',
} as const;
/**
* Formatear una fecha UTC en la zona horaria local
*/
export function formatDate(
date: string | Date,
format: keyof typeof DATE_FORMATS = 'date'
): string {
return dayjs(date).tz(DEFAULT_TZ).format(DATE_FORMATS[format]);
}
/**
* Devolver tiempo relativo ("hace 3 minutos", "hace 2 horas", "ayer", etc.)
*/
export function timeAgo(date: string | Date): string {
const d = dayjs(date);
const now = dayjs();
const diffHours = now.diff(d, 'hour');
if (diffHours < 1) {
const diffMinutes = now.diff(d, 'minute');
if (diffMinutes < 1) return 'justo ahora';
return `hace ${diffMinutes} min`;
}
if (diffHours < 24) return `hace ${diffHours}h`;
if (diffHours < 48) return 'ayer';
if (diffHours < 168) return `hace ${Math.floor(diffHours / 24)} dias`;
return formatDate(date, 'date');
}
/**
* Conversion de zona horaria
*/
export function convertTimezone(
date: string | Date,
fromTz: string,
toTz: string
): dayjs.Dayjs {
return dayjs.tz(date, fromTz).tz(toTz);
}
/**
* Determinar si es dia habil
*/
export function isBusinessDay(date: string | Date): boolean {
const d = dayjs(date);
const dayOfWeek = d.day();
return dayOfWeek !== 0 && dayOfWeek !== 6; // Domingo=0, Sabado=6
}
/**
* Obtener la fecha N dias habiles despues
*/
export function addBusinessDays(date: string | Date, days: number): dayjs.Dayjs {
let current = dayjs(date);
let remaining = days;
while (remaining > 0) {
current = current.add(1, 'day');
if (isBusinessDay(current.toDate())) {
remaining--;
}
}
return current;
}
Formato nativo con la API Intl
Sin bibliotecas, la API Intl del navegador permite muchos formatos.
// src/lib/intl-date.ts
/**
* Formato de fecha usando Intl.DateTimeFormat
*/
export function formatDateIntl(date: Date, style: 'long' | 'short' = 'long'): string {
return new Intl.DateTimeFormat('es-ES', {
year: 'numeric',
month: style === 'long' ? 'long' : 'numeric',
day: 'numeric',
weekday: style === 'long' ? 'short' : undefined,
}).format(date);
}
/**
* Mostrar la diferencia entre dos fechas en formato legible
*/
export function formatDateRange(start: Date, end: Date): string {
return new Intl.DateTimeFormat('es-ES', {
year: 'numeric',
month: 'short',
day: 'numeric',
}).formatRange(start, end);
}
/**
* Formato de tiempo relativo
*/
export function formatRelative(date: Date): string {
const rtf = new Intl.RelativeTimeFormat('es', { numeric: 'auto' });
const now = new Date();
const diffMs = date.getTime() - now.getTime();
const diffSec = Math.round(diffMs / 1000);
const diffMin = Math.round(diffSec / 60);
const diffHour = Math.round(diffMin / 60);
const diffDay = Math.round(diffHour / 24);
if (Math.abs(diffSec) < 60) return rtf.format(diffSec, 'second');
if (Math.abs(diffMin) < 60) return rtf.format(diffMin, 'minute');
if (Math.abs(diffHour) < 24) return rtf.format(diffHour, 'hour');
return rtf.format(diffDay, 'day');
}
Uso en componentes React
// src/components/TimeDisplay.tsx
'use client';
import { useState, useEffect } from 'react';
import { timeAgo } from '@/lib/date-utils';
export function TimeDisplay({ date }: { date: string }) {
const [display, setDisplay] = useState(timeAgo(date));
useEffect(() => {
const interval = setInterval(() => {
setDisplay(timeAgo(date));
}, 60000); // Actualizar cada minuto
return () => clearInterval(interval);
}, [date]);
return (
<time dateTime={date} title={new Date(date).toLocaleString('es-ES')}>
{display}
</time>
);
}
Trampas comunes
- No considerar zonas horarias: Cuando el servidor y el cliente tienen zonas horarias diferentes, siempre guardar en UTC y convertir en el cliente
- Horario de verano: Tener cuidado al soportar usuarios internacionales
- Comportamiento de Date.parse(): Hay diferencias entre navegadores, usar day.js u otra biblioteca para parsear
Articulos relacionados
Para la internacionalizacion en general, consulta la guia de implementacion de i18n, y para el formato de moneda, consulta la implementacion de formato de moneda.
Puedes consultar la lista de plugins en la documentacion oficial de day.js (day.js.org).
Related Posts
Cómo potenciar tus proyectos personales con Claude Code [Con ejemplos]
Aprende a acelerar drásticamente tus proyectos personales de desarrollo usando Claude Code. Incluye ejemplos reales y un flujo de trabajo práctico desde la idea hasta el despliegue.
Cómo automatizar la refactorización con Claude Code
Aprende a automatizar eficientemente la refactorización de código usando Claude Code. Incluye prompts prácticos y patrones concretos de refactorización para proyectos reales.
Guia completa de configuracion CORS con Claude Code
Aprende sobre la configuracion completa de CORS usando Claude Code. Incluye consejos practicos y ejemplos de codigo.