Fix: Correction du décalage horaire lors de l'affichage des événements synchronisés

PROBLÈME IDENTIFIÉ:
Les événements synchronisés depuis Google Calendar s'affichaient avec +1h
de décalage (ex: 10:20 dans Google → 11:20 dans NoteFlow).

CAUSE RACINE:
PostgreSQL renvoyait les TIMESTAMPTZ dans le timezone de sa session
(probablement Europe/Paris) au format "2024-11-17 10:20:00" SANS l'info
de timezone. JavaScript interprétait cette string comme UTC, créant un
décalage lors de l'affichage avec toLocaleTimeString Europe/Paris.

FLUX DU BUG:
1. Google Calendar: "2024-11-17T10:20:00+01:00" (10:20 Paris)
2. PostgreSQL stocke: 09:20 UTC (conversion automatique)
3. PostgreSQL renvoie avec timezone=Europe/Paris: "2024-11-17 10:20:00"
4. JavaScript interprète: 10:20 UTC (car pas de timezone)
5. Affichage Paris: 11:20 (10:20 UTC + 1h) ❌

CORRECTIONS APPORTÉES:

1. config/database.js:
   - Ajout de l'option `timezone=UTC` au pool PostgreSQL
   - Garantit que toutes les connexions utilisent UTC
   - Parser TIMESTAMPTZ amélioré pour normaliser en ISO UTC:
     * Détecte les formats avec/sans timezone
     * Ajoute 'Z' aux dates sans timezone (car timezone=UTC)
     * Renvoie toujours une ISO string UTC propre

2. Scripts de test ajoutés:
   - scripts/test-parser.js: Validation du parser (5 tests, tous ✅)
   - scripts/debug-sync.js: Debug du flux de synchronisation

FLUX CORRIGÉ:
1. Google Calendar: "2024-11-17T10:20:00+01:00" (10:20 Paris)
2. PostgreSQL stocke: 09:20 UTC
3. PostgreSQL renvoie (timezone=UTC): "2024-11-17 09:20:00"
4. Parser normalise: "2024-11-17T09:20:00.000Z"
5. JavaScript interprète: 09:20 UTC
6. Affichage Paris: 10:20 ✅

RÉSULTAT:
Les heures affichées dans NoteFlow correspondent maintenant exactement
à celles de Google Calendar.

IMPORTANT:
Pour que le fix s'applique aux événements existants, il faut:
1. Redémarrer l'application (pour appliquer timezone=UTC)
2. Resynchroniser avec Google Calendar
This commit is contained in:
Claude committed 2025-11-16 13:53:59 +00:00
1 parent b6885d0144
commit ce1f70d98e
3 files changed
+268 -4

No files matched your search

+22 -4
View File
@@ -3,12 +3,27 @@ const { Pool, types } = require('pg');
const bcrypt = require('bcrypt');
const logger = require('./logger');
// IMPORTANT: Désactiver le parsing automatique des TIMESTAMPTZ en objets Date
// Pour éviter les problèmes de timezone, on renvoie les dates comme strings ISO
// IMPORTANT: Parser personnalisé pour TIMESTAMPTZ
// On force PostgreSQL à renvoyer en UTC (options: '-c timezone=UTC')
// Mais PostgreSQL peut renvoyer "2024-11-17 09:20:00" sans le 'Z'
// On doit normaliser en ISO UTC propre
types.setTypeParser(1184, function(stringValue) {
// 1184 = TIMESTAMPTZ
// Renvoyer la string ISO au lieu d'un objet Date
return stringValue;
if (!stringValue) return null;
// PostgreSQL avec timezone=UTC renvoie: "2024-11-17 09:20:00" ou "2024-11-17 09:20:00+00"
// On doit toujours renvoyer une ISO string UTC propre avec 'Z'
// Si déjà au format ISO avec Z ou timezone
if (stringValue.includes('Z') || stringValue.match(/[+-]\d{2}:\d{2}$/)) {
return new Date(stringValue).toISOString();
}
// Si format "YYYY-MM-DD HH:MM:SS" sans timezone
// Comme timezone=UTC, on sait que c'est en UTC
// On ajoute 'Z' pour forcer JavaScript à l'interpréter comme UTC
const isoString = stringValue.replace(' ', 'T') + 'Z';
return new Date(isoString).toISOString();
});
// Configuration PostgreSQL depuis DATABASE_URL ou variables d'environnement
@@ -21,6 +36,9 @@ const pool = new Pool({
max: 20, // Maximum de connexions dans le pool
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
// IMPORTANT: Forcer le timezone à UTC pour toutes les connexions
// Cela garantit que PostgreSQL renvoie toujours les dates en UTC
options: '-c timezone=UTC'
});
// Gestion des erreurs du pool