Checkpoint: Correction définitive du décalage horaire : parseLocalDateTime retourne maintenant directement une chaîne au format MySQL "YYYY-MM-DD HH:mm:ss" au lieu d'un objet Date JavaScript. Cela évite toute conversion UTC automatique lors de l'insertion en base de données. L'heure saisie (par exemple 09:48) est maintenant stockée et affichée exactement telle quelle sans décalage.

This commit is contained in:
Manus Sandbox
2025-11-13 10:17:35 -05:00
parent 1031c57f96
commit 7e0e9d0586
3 changed files with 15 additions and 29 deletions

View File

@@ -4,17 +4,16 @@
*/ */
/** /**
* Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en Date * Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en chaîne MySQL
* en préservant l'heure locale (pas de conversion UTC) * Format de sortie: "YYYY-MM-DD HH:mm:ss"
* Retourne une Date construite manuellement pour éviter les conversions de fuseau horaire * Préserve l'heure locale sans aucune conversion UTC
*/ */
export function parseLocalDateTime(dateTimeString: string): Date { export function parseLocalDateTime(dateTimeString: string): string {
if (!dateTimeString) { if (!dateTimeString) {
throw new Error('Date string is required'); throw new Error('Date string is required');
} }
// Le format datetime-local est "YYYY-MM-DDTHH:mm" // Le format datetime-local est "YYYY-MM-DDTHH:mm"
// Parser manuellement pour éviter les conversions UTC
const match = dateTimeString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/); const match = dateTimeString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/);
if (!match) { if (!match) {
@@ -23,24 +22,9 @@ export function parseLocalDateTime(dateTimeString: string): Date {
const [, year, month, day, hours, minutes] = match; const [, year, month, day, hours, minutes] = match;
// Créer une Date en utilisant le constructeur avec les composants locaux // Retourner directement au format MySQL sans passer par un objet Date
// Cela évite la conversion UTC automatique // Cela évite toute conversion de fuseau horaire
const date = new Date( return `${year}-${month}-${day} ${hours}:${minutes}:00`;
parseInt(year),
parseInt(month) - 1, // Les mois commencent à 0 en JavaScript
parseInt(day),
parseInt(hours),
parseInt(minutes),
0, // secondes
0 // millisecondes
);
// Vérifier que la date est valide
if (isNaN(date.getTime())) {
throw new Error(`Invalid date string: ${dateTimeString}`);
}
return date;
} }
/** /**

View File

@@ -168,7 +168,7 @@ export const appRouter = router({
// Créer la séquence // Créer la séquence
const result = await db.createSequence({ const result = await db.createSequence({
...sequenceData, ...sequenceData,
dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), dateBlocage: parseLocalDateTime(sequenceData.dateBlocage) as any,
}); });
// Récupérer l'ID de la séquence créée // Récupérer l'ID de la séquence créée
@@ -178,8 +178,8 @@ export const appRouter = router({
for (const date of dates) { for (const date of dates) {
await db.createDateFormation({ await db.createDateFormation({
sequenceId, sequenceId,
dateDebut: parseLocalDateTime(date.dateDebut), dateDebut: parseLocalDateTime(date.dateDebut) as any,
dateFin: parseLocalDateTime(date.dateFin), dateFin: parseLocalDateTime(date.dateFin) as any,
ordre: date.ordre, ordre: date.ordre,
}); });
} }
@@ -208,7 +208,7 @@ export const appRouter = router({
// Mettre à jour la séquence // Mettre à jour la séquence
const updateData: any = { const updateData: any = {
...sequenceData, ...sequenceData,
dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), dateBlocage: parseLocalDateTime(sequenceData.dateBlocage) as any,
}; };
console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2)); 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); console.log('[UPDATE SEQUENCE] Création date:', date);
await db.createDateFormation({ await db.createDateFormation({
sequenceId: id, sequenceId: id,
dateDebut: parseLocalDateTime(date.dateDebut), dateDebut: parseLocalDateTime(date.dateDebut) as any,
dateFin: parseLocalDateTime(date.dateFin), dateFin: parseLocalDateTime(date.dateFin) as any,
ordre: date.ordre, ordre: date.ordre,
}); });
} }

View File

@@ -113,3 +113,5 @@
- [x] Corriger les fonctions formatDate pour gérer les objets Date JavaScript en plus des chaînes MySQL - [x] Corriger les fonctions formatDate pour gérer les objets Date JavaScript en plus des chaînes MySQL
- [x] Forcer le fuseau horaire Europe/Paris dans la connexion MySQL pour éliminer le décalage d'une heure - [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)