diff --git a/server/dateUtils.ts b/server/dateUtils.ts new file mode 100644 index 0000000..d930f24 --- /dev/null +++ b/server/dateUtils.ts @@ -0,0 +1,33 @@ +/** + * Utilitaires pour la gestion des dates + * Gère correctement les conversions entre heure locale et UTC + */ + +/** + * Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en Date + * en préservant l'heure locale (pas de conversion UTC) + */ +export function parseLocalDateTime(dateTimeString: string): Date { + // Le format datetime-local est "YYYY-MM-DDTHH:mm" + // On ajoute ":00" pour les secondes si nécessaire + const normalized = dateTimeString.length === 16 ? `${dateTimeString}:00` : dateTimeString; + + // Créer la date en heure locale + const date = new Date(normalized); + + return date; +} + +/** + * Formate une Date en chaîne datetime-local pour les inputs HTML + * Format: "YYYY-MM-DDTHH:mm" + */ +export function formatToLocalDateTime(date: Date): string { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + const hours = String(date.getHours()).padStart(2, '0'); + const minutes = String(date.getMinutes()).padStart(2, '0'); + + return `${year}-${month}-${day}T${hours}:${minutes}`; +} diff --git a/server/routers.ts b/server/routers.ts index acfcf09..fead7ef 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -2,6 +2,7 @@ import { COOKIE_NAME } from "@shared/const"; import { getSessionCookieOptions } from "./_core/cookies"; import { systemRouter } from "./_core/systemRouter"; import { publicProcedure, protectedProcedure, router } from "./_core/trpc"; +import { parseLocalDateTime } from "./dateUtils"; import { z } from "zod"; import * as db from "./db"; import { TRPCError } from "@trpc/server"; @@ -167,7 +168,7 @@ export const appRouter = router({ // Créer la séquence const result = await db.createSequence({ ...sequenceData, - dateBlocage: new Date(sequenceData.dateBlocage), + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), }); // Récupérer l'ID de la séquence créée @@ -177,8 +178,8 @@ export const appRouter = router({ for (const date of dates) { await db.createDateFormation({ sequenceId, - dateDebut: new Date(date.dateDebut), - dateFin: new Date(date.dateFin), + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), ordre: date.ordre, }); } @@ -207,7 +208,7 @@ export const appRouter = router({ // Mettre à jour la séquence const updateData: any = { ...sequenceData, - dateBlocage: new Date(sequenceData.dateBlocage), + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), }; console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2)); @@ -220,8 +221,8 @@ export const appRouter = router({ for (const date of dates) { await db.createDateFormation({ sequenceId: id, - dateDebut: new Date(date.dateDebut), - dateFin: new Date(date.dateFin), + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), ordre: date.ordre, }); } diff --git a/todo.md b/todo.md index 8cbc915..5c8a515 100644 --- a/todo.md +++ b/todo.md @@ -105,3 +105,5 @@ - [ ] Corriger la modification des heures d'une séquence (toujours non fonctionnelle) - [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