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:
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
2
todo.md
2
todo.md
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user