/** * Utilitaires pour la manipulation des dates */ export function formatDate( date: string | Date, format: 'short' | 'long' | 'relative' = 'short', ): string { const d = new Date(date); if (isNaN(d.getTime())) { return 'Invalid date'; } switch (format) { case 'short': return d.toLocaleDateString(); case 'long': return d.toLocaleDateString('fr-FR', { year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit', }); case 'relative': return formatRelativeTime(d); default: return d.toLocaleDateString(); } } export function formatRelativeTime(date: Date): string { const now = new Date(); const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); if (diffInSeconds < 60) { return "À l'instant"; } const diffInMinutes = Math.floor(diffInSeconds / 60); if (diffInMinutes < 60) { return `Il y a ${diffInMinutes} minute${diffInMinutes > 1 ? 's' : ''}`; } const diffInHours = Math.floor(diffInMinutes / 60); if (diffInHours < 24) { return `Il y a ${diffInHours} heure${diffInHours > 1 ? 's' : ''}`; } const diffInDays = Math.floor(diffInHours / 24); if (diffInDays < 7) { return `Il y a ${diffInDays} jour${diffInDays > 1 ? 's' : ''}`; } const diffInWeeks = Math.floor(diffInDays / 7); if (diffInWeeks < 4) { return `Il y a ${diffInWeeks} semaine${diffInWeeks > 1 ? 's' : ''}`; } const diffInMonths = Math.floor(diffInDays / 30); if (diffInMonths < 12) { return `Il y a ${diffInMonths} mois`; } const diffInYears = Math.floor(diffInDays / 365); return `Il y a ${diffInYears} an${diffInYears > 1 ? 's' : ''}`; } export function isToday(date: string | Date): boolean { const d = new Date(date); const today = new Date(); return ( d.getDate() === today.getDate() && d.getMonth() === today.getMonth() && d.getFullYear() === today.getFullYear() ); } export function isYesterday(date: string | Date): boolean { const d = new Date(date); const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); return ( d.getDate() === yesterday.getDate() && d.getMonth() === yesterday.getMonth() && d.getFullYear() === yesterday.getFullYear() ); } export function getTimeAgo(date: string | Date): string { if (isToday(date)) { return new Date(date).toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit', }); } if (isYesterday(date)) { return 'Hier'; } return formatDate(date, 'short'); } export function formatDuration(seconds: number): string { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); const remainingSeconds = Math.floor(seconds % 60); if (hours > 0) { return `${hours}:${minutes.toString().padStart(2, '0')}:${remainingSeconds.toString().padStart(2, '0')}`; } return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; } export function parseDuration(duration: string): number { const parts = duration.split(':').map(Number); if (parts.length === 2) { // MM:SS return parts[0] * 60 + parts[1]; } else if (parts.length === 3) { // HH:MM:SS return parts[0] * 3600 + parts[1] * 60 + parts[2]; } return 0; }