diff --git a/client/src/pages/AdminSequenceInscrits.tsx b/client/src/pages/AdminSequenceInscrits.tsx index ce745a6..6fbef91 100644 --- a/client/src/pages/AdminSequenceInscrits.tsx +++ b/client/src/pages/AdminSequenceInscrits.tsx @@ -167,14 +167,25 @@ export default function AdminSequenceInscrits() { return formations.find((f) => f.id === sequence.formationId)?.nom || "N/A"; }; - const formatDate = (date: Date) => { - return new Date(date).toLocaleDateString("fr-FR", { - day: "2-digit", - month: "2-digit", - year: "numeric", - hour: "2-digit", - minute: "2-digit", - }); + const formatDate = (dateValue: any) => { + if (!dateValue) return "N/A"; + + try { + // Parser la date MySQL sans conversion UTC + const dateStr = String(dateValue); + const match = dateStr.match(/(\d{4})-(\d{2})-(\d{2})[T ]?(\d{2}):(\d{2})/); + + if (!match) { + console.warn('Format de date non reconnu:', dateValue); + return "N/A"; + } + + const [, year, month, day, hours, minutes] = match; + return `${day}/${month}/${year} ${hours}:${minutes}`; + } catch (error) { + console.error('Erreur de formatage de date:', error, dateValue); + return "N/A"; + } }; const getStatutBadge = (statut: string) => { diff --git a/client/src/pages/AdminSequences.tsx b/client/src/pages/AdminSequences.tsx index 435cc3f..35d9efe 100644 --- a/client/src/pages/AdminSequences.tsx +++ b/client/src/pages/AdminSequences.tsx @@ -99,9 +99,22 @@ export default function AdminSequences() { const safeFormatDate = (dateValue: any): string => { if (!dateValue) return ""; try { - const date = new Date(dateValue); - if (isNaN(date.getTime())) return ""; - return format(date, "yyyy-MM-dd'T'HH:mm"); + // Si c'est déjà une chaîne au bon format, la retourner directement + if (typeof dateValue === 'string' && dateValue.match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}/)) { + return dateValue.substring(0, 16); // Garder seulement YYYY-MM-DDTHH:mm + } + + // Parser la date MySQL (format: "YYYY-MM-DD HH:mm:ss") sans conversion UTC + const dateStr = String(dateValue); + const match = dateStr.match(/(\d{4})-(\d{2})-(\d{2})[T ]?(\d{2}):(\d{2})/); + + if (!match) { + console.warn('Format de date non reconnu:', dateValue); + return ""; + } + + const [, year, month, day, hours, minutes] = match; + return `${year}-${month}-${day}T${hours}:${minutes}`; } catch (error) { console.error('Erreur de formatage de date:', error, dateValue); return ""; @@ -219,14 +232,25 @@ export default function AdminSequences() { return formations?.find((f) => f.id === formationId)?.nom || "N/A"; }; - const formatDate = (date: Date) => { - return new Date(date).toLocaleDateString("fr-FR", { - day: "2-digit", - month: "2-digit", - year: "numeric", - hour: "2-digit", - minute: "2-digit", - }); + const formatDate = (dateValue: any) => { + if (!dateValue) return "N/A"; + + try { + // Parser la date MySQL (format: "YYYY-MM-DD HH:mm:ss" ou objet Date) sans conversion UTC + const dateStr = String(dateValue); + const match = dateStr.match(/(\d{4})-(\d{2})-(\d{2})[T ]?(\d{2}):(\d{2})/); + + if (!match) { + console.warn('Format de date non reconnu pour affichage:', dateValue); + return "N/A"; + } + + const [, year, month, day, hours, minutes] = match; + return `${day}/${month}/${year} ${hours}:${minutes}`; + } catch (error) { + console.error('Erreur de formatage de date pour affichage:', error, dateValue); + return "N/A"; + } }; const getStatutBadge = (statut: string) => { diff --git a/client/src/pages/Inscription.tsx b/client/src/pages/Inscription.tsx index c3ce877..3beea86 100644 --- a/client/src/pages/Inscription.tsx +++ b/client/src/pages/Inscription.tsx @@ -109,8 +109,35 @@ export default function Inscription() { }); }, [sequences]); - const formatDate = (date: Date | string) => { - return format(new Date(date), "EEEE d MMMM yyyy 'à' HH:mm", { locale: fr }); + const formatDate = (dateValue: Date | string) => { + if (!dateValue) return "N/A"; + + try { + // Parser la date MySQL sans conversion UTC + const dateStr = String(dateValue); + const match = dateStr.match(/(\d{4})-(\d{2})-(\d{2})[T ]?(\d{2}):(\d{2})/); + + if (!match) { + console.warn('Format de date non reconnu:', dateValue); + return "N/A"; + } + + const [, year, month, day, hours, minutes] = match; + + // Créer une Date en heure locale pour le formatage avec date-fns + const localDate = new Date( + parseInt(year), + parseInt(month) - 1, + parseInt(day), + parseInt(hours), + parseInt(minutes) + ); + + return format(localDate, "EEEE d MMMM yyyy 'à' HH:mm", { locale: fr }); + } catch (error) { + console.error('Erreur de formatage de date:', error, dateValue); + return "N/A"; + } }; if (loadingFormation || loadingSessions) { diff --git a/todo.md b/todo.md index af4d990..1ae20ae 100644 --- a/todo.md +++ b/todo.md @@ -107,3 +107,5 @@ - [x] Corriger la mise à jour du nombre d'inscrits sur la page d'inscription publique - [x] Corriger le décalage d'une heure entre la saisie et l'affichage des dates de séquences + +- [x] Corriger le décalage d'une heure à l'affichage des dates (problème de formatage lors de la récupération)