veza/apps/web/src/utils/date.ts
2025-12-12 21:34:34 -05:00

132 lines
3.2 KiB
TypeScript

/**
* 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;
}