From 4152b88c915bba09c7c20dc326f6d51c51a1e1db Mon Sep 17 00:00:00 2001 From: Manus Sandbox Date: Thu, 13 Nov 2025 10:24:37 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Correction=20finale=20du=20d?= =?UTF-8?q?=C3=A9calage=20horaire=20:=20parseLocalDateTime=20compense=20ma?= =?UTF-8?q?intenant=20automatiquement=20le=20d=C3=A9calage=20UTC=20en=20ut?= =?UTF-8?q?ilisant=20getTimezoneOffset().=20Cela=20garantit=20que=20l'heur?= =?UTF-8?q?e=20saisie=20(par=20exemple=2009:48)=20est=20stock=C3=A9e=20en?= =?UTF-8?q?=20UTC=20de=20mani=C3=A8re=20=C3=A0=20=C3=AAtre=20affich=C3=A9e?= =?UTF-8?q?=20correctement=20en=20heure=20locale.=20Le=20param=C3=A8tre=20?= =?UTF-8?q?timezone=20a=20=C3=A9t=C3=A9=20retir=C3=A9=20de=20la=20connexio?= =?UTF-8?q?n=20MySQL=20pour=20=C3=A9viter=20les=20doubles=20conversions.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/dateUtils.ts | 32 +++++++++++++++++++++++++------- server/db.ts | 8 +------- server/routers.ts | 12 ++++++------ todo.md | 2 ++ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/server/dateUtils.ts b/server/dateUtils.ts index 26661df..6f1c294 100644 --- a/server/dateUtils.ts +++ b/server/dateUtils.ts @@ -4,11 +4,11 @@ */ /** - * Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en chaîne MySQL - * Format de sortie: "YYYY-MM-DD HH:mm:ss" - * Préserve l'heure locale sans aucune conversion UTC + * Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en Date + * en construisant la date avec une chaîne ISO qui force l'heure locale + * Préserve l'heure locale sans conversion UTC */ -export function parseLocalDateTime(dateTimeString: string): string { +export function parseLocalDateTime(dateTimeString: string): Date { if (!dateTimeString) { throw new Error('Date string is required'); } @@ -22,9 +22,27 @@ export function parseLocalDateTime(dateTimeString: string): string { const [, year, month, day, hours, minutes] = match; - // Retourner directement au format MySQL sans passer par un objet Date - // Cela évite toute conversion de fuseau horaire - return `${year}-${month}-${day} ${hours}:${minutes}:00`; + // Créer un objet Date en utilisant le constructeur avec composants + // MySQL stocke en UTC, donc on doit compenser le décalage horaire + const date = new Date( + parseInt(year), + parseInt(month) - 1, + parseInt(day), + parseInt(hours), + parseInt(minutes), + 0 + ); + + // Compenser le décalage UTC en ajoutant le décalage du fuseau horaire + // Cela garantit que l'heure stockée en UTC correspond à l'heure locale saisie + const offset = date.getTimezoneOffset(); // en minutes (négatif pour Europe/Paris) + date.setMinutes(date.getMinutes() - offset); + + if (isNaN(date.getTime())) { + throw new Error(`Invalid date string: ${dateTimeString}`); + } + + return date; } /** diff --git a/server/db.ts b/server/db.ts index 938bb22..2894292 100644 --- a/server/db.ts +++ b/server/db.ts @@ -26,13 +26,7 @@ let _db: ReturnType | null = null; export async function getDb() { if (!_db && process.env.DATABASE_URL) { try { - // Ajouter le fuseau horaire Europe/Paris dans l'URL de connexion - let connectionUrl = process.env.DATABASE_URL; - if (!connectionUrl.includes('timezone=')) { - const separator = connectionUrl.includes('?') ? '&' : '?'; - connectionUrl += `${separator}timezone=%2B01:00`; // +01:00 URL encoded - } - _db = drizzle(connectionUrl); + _db = drizzle(process.env.DATABASE_URL); } catch (error) { console.warn("[Database] Failed to connect:", error); _db = null; diff --git a/server/routers.ts b/server/routers.ts index 6761ff2..eb15e31 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -168,7 +168,7 @@ export const appRouter = router({ // Créer la séquence const result = await db.createSequence({ ...sequenceData, - dateBlocage: parseLocalDateTime(sequenceData.dateBlocage) as any, + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), }); // Récupérer l'ID de la séquence créée @@ -178,8 +178,8 @@ export const appRouter = router({ for (const date of dates) { await db.createDateFormation({ sequenceId, - dateDebut: parseLocalDateTime(date.dateDebut) as any, - dateFin: parseLocalDateTime(date.dateFin) as any, + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), ordre: date.ordre, }); } @@ -208,7 +208,7 @@ export const appRouter = router({ // Mettre à jour la séquence const updateData: any = { ...sequenceData, - dateBlocage: parseLocalDateTime(sequenceData.dateBlocage) as any, + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), }; console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2)); @@ -224,8 +224,8 @@ export const appRouter = router({ console.log('[UPDATE SEQUENCE] Création date:', date); await db.createDateFormation({ sequenceId: id, - dateDebut: parseLocalDateTime(date.dateDebut) as any, - dateFin: parseLocalDateTime(date.dateFin) as any, + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), ordre: date.ordre, }); } diff --git a/todo.md b/todo.md index 04593f6..3da69e3 100644 --- a/todo.md +++ b/todo.md @@ -115,3 +115,5 @@ - [x] Forcer le fuseau horaire Europe/Paris dans la connexion MySQL pour éliminer le décalage d'une heure - [x] Corriger le décalage horaire persistant dans parseLocalDateTime (09:48 envoyé devient 10:48 en base) + +- [x] Corriger l'erreur "toISOString is not a function" lors de la modification de séquences