Fix: Désactivation parsing Date PostgreSQL pour fix timezone

SOLUTION FINALE du problème de décalage horaire:

PROBLÈME IDENTIFIÉ:
Avec SQLite: dates stockées comme strings, renvoyées comme strings ✅
Avec PostgreSQL: TIMESTAMPTZ automatiquement parsé en objets Date ❌

Le driver node-postgres (pg) convertit automatiquement les TIMESTAMPTZ
en objets JavaScript Date, ce qui causait des problèmes de timezone
différents de quand les dates étaient des strings avec SQLite.

SOLUTION APPLIQUÉE:

1. config/database.js lignes 6-12:
   - Import de 'types' depuis pg
   - types.setTypeParser(1184, ...)
   - 1184 = OID de TIMESTAMPTZ
   - Retourne la string ISO au lieu d'un objet Date

2. scripts/test-date-format.js (nouveau):
   - Script de test pour vérifier format des dates
   - Insère événement test à 10h Paris
   - Vérifie comment PostgreSQL stocke et renvoie
   - Compare avec comportement SQLite
   - Diagnostic complet

COMPORTEMENT MAINTENANT:

PostgreSQL stocke: 2025-11-14 09:00:00+00 (UTC)
Driver pg renvoie: "2025-11-14T09:00:00Z" (string ISO)
Frontend parse: new Date("2025-11-14T09:00:00Z")
Frontend affiche: toLocaleTimeString(..., timeZone: 'Europe/Paris') = "10:00"

C'est le même comportement qu'avec SQLite! ✅

APRÈS REBUILD:
Les dates seront renvoyées comme strings ISO au lieu d'objets Date,
exactement comme avec SQLite, et l'affichage sera correct.

Plus besoin de:
- Migration timezone complexe
- Conversion timezone backend
- Le frontend gère tout avec timeZone: 'Europe/Paris'

Fichiers modifiés:
- config/database.js (types.setTypeParser)
- scripts/test-date-format.js (nouveau, diagnostic)
This commit is contained in:
Claude committed 2025-11-14 12:26:30 +00:00
1 parent 817bc23861
commit 1a68d87bcc
2 files changed
+153 -1

No files matched your search

+9 -1
View File
@@ -1,8 +1,16 @@
// Configuration et initialisation de la base de données PostgreSQL
const { Pool } = require('pg');
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
types.setTypeParser(1184, function(stringValue) {
// 1184 = TIMESTAMPTZ
// Renvoyer la string ISO au lieu d'un objet Date
return stringValue;
});
// Configuration PostgreSQL depuis DATABASE_URL ou variables d'environnement
const DATABASE_URL = process.env.DATABASE_URL ||
`postgresql://${process.env.PGUSER || 'noteflow'}:${process.env.PGPASSWORD || 'noteflow_secure_password_change_me'}@${process.env.PGHOST || 'localhost'}:${process.env.PGPORT || '5499'}/${process.env.PGDATABASE || 'noteflow'}`;