132 lines
3.2 KiB
TypeScript
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;
|
|
}
|