Travail avec les dates et l'heure en C# : techniques avancées et conseils

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travail avancé avec les dates et l'heure en C# : de la théorie aux problèmes réels

Le travail avec les dates et l'heure est l'une des tâches les plus fréquentes et en même temps les plus délicates en développement. Au niveau débutant, nous créons simplement DateTime.Now et l'affichons dans la console. Mais lorsque le projet dépasse le cadre de jouet, des complexités apparaissent : le passage à l'heure d'été, différents fuseaux horaires, une haute précision de calcul ou la nécessité de travailler avec des dates sans fuseau horaire. Dans cet article, nous analyserons les techniques avancées de travail avec les dates et l'heure en C# (.NET) qui vous aideront à écrire un code fiable et prévisible.



1. DateTime, DateTimeOffset et TimeSpan : choisir le bon outil

De nombreux développeurs utilisent DateTime par défaut, sans réfléchir à ses limitations. Au niveau avancé, il est important de comprendre la différence entre les trois types principaux.



DateTime

Stocke la date et l'heure. Son principal problème est l'ambiguïté. La propriété Kind (Local, Utc, Unspecified) n'est pas toujours définie explicitement, ce qui entraîne des erreurs lors de la sérialisation ou de la comparaison.



DateTimeOffset

Stocke la date, l'heure et le décalage par rapport à UTC. C'est le type recommandé pour stocker des instants temporels, car il définit sans ambiguïté un point sur la ligne du temps. Par exemple, 2025-03-15T14:00:00+03:00 est toujours un moment spécifique, indépendamment du fuseau horaire de l'utilisateur.



TimeSpan

Représente un intervalle de temps, et non un moment spécifique. Utilisé pour l'arithmétique : différence entre dates, délais d'attente, durée des opérations.



// Exemple : DateTime vs DateTimeOffsetDateTime localNow = DateTime.Now; // Kind = LocalDateTime utcNow = DateTime.UtcNow; // Kind = Utc

DateTimeOffset preciseNow = DateTimeOffset.Now; // Toujours avec indication du décalage

// Comparaison : DateTimeOffset est plus univoqueConsole.WriteLine(preciseNow.Offset); // +03:00 ou -05:00 etc.


Conseil : Pour les nouveaux projets, utilisez DateTimeOffset pour stocker les instants temporels, TimeSpan pour les intervalles, et DateTime uniquement lorsque cela est vraiment nécessaire (par exemple, pour la compatibilité avec du code ancien).



2. Analyse et formatage : comment éviter FormatException

L'analyse des dates à partir de chaînes est une source de nombreuses erreurs, surtout si les chaînes proviennent d'utilisateurs ou de différentes cultures.



Analyse dépendante de la culture

Utilisez CultureInfo.InvariantCulture pour l'échange de données interne (par exemple, JSON, API). Pour la saisie utilisateur, tenez compte de la culture de l'utilisateur.



// Analyse avec prise en compte de la culturestring dateString = "15.03.2025";var ruCulture = new CultureInfo("ru-RU");DateTime parsedDate = DateTime.Parse(dateString, ruCulture);

// Analyse invariante (recommandée pour les API)string isoString = "2025-03-15T14:00:00Z";DateTimeOffset parsedIso = DateTimeOffset.Parse(isoString, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);


TryParseExact pour la fiabilité

Si le format de la chaîne est connu, utilisez TryParseExact avec une indication explicite du format. Cela exclut les exceptions inattendues.



string input = "2025-03-15 14:30";string format = "yyyy-MM-dd HH:mm";if (DateTime.TryParseExact(input, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result)){    Console.WriteLine($"Succès : {result}");}else{    Console.WriteLine("Erreur d'analyse");}


Formatage personnalisé

Les spécificateurs standard (d, D, t, T) sont bons, mais pour un contrôle précis, utilisez des chaînes de format personnalisées.



DateTime now = DateTime.Now;Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 2025-03-15 14:30:45.123Console.WriteLine(now.ToString("dd MMMM yyyy, dddd"));      // 15 ma                

Blogs

Book Recommendations