This commit is contained in:
Manus Sandbox
2025-11-19 08:41:10 -05:00
parent 5085159cf7
commit 37e0f8da49
54 changed files with 13118 additions and 55 deletions

60
server/dateUtils.ts Normal file
View File

@@ -0,0 +1,60 @@
/**
* 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 construisant la date avec une chaîne ISO qui force l'heure locale
* Préserve l'heure locale sans conversion UTC
*/
export function parseLocalDateTime(dateTimeString: string): Date {
if (!dateTimeString) {
throw new Error('Date string is required');
}
// Le format datetime-local est "YYYY-MM-DDTHH:mm"
const match = dateTimeString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})/);
if (!match) {
throw new Error(`Invalid date format: ${dateTimeString}. Expected YYYY-MM-DDTHH:mm`);
}
const [, year, month, day, hours, minutes] = match;
// Créer un objet Date en utilisant le constructeur avec composants
// MySQL stocke en UTC, donc on doit compenser le décalage horaire
const date = new Date(
parseInt(year),
parseInt(month) - 1,
parseInt(day),
parseInt(hours),
parseInt(minutes),
0
);
// Compenser le décalage UTC en ajoutant le décalage du fuseau horaire
// Cela garantit que l'heure stockée en UTC correspond à l'heure locale saisie
const offset = date.getTimezoneOffset(); // en minutes (négatif pour Europe/Paris)
date.setMinutes(date.getMinutes() - offset);
if (isNaN(date.getTime())) {
throw new Error(`Invalid date string: ${dateTimeString}`);
}
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}`;
}