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

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# : des opérations de base aux solutions haute performance

\n

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. Une erreur de fuseau horaire ou un formatage incorrect peut entraîner des bogues graves en production. Dans cet article, nous dépasserons les constructeurs de base de DateTime et analyserons les techniques avancées : DateTimeOffset, le travail avec les fuseaux horaires, les mesures de haute précision via Stopwatch, ainsi que les questions de performance et de sécurité des threads. Le contenu est destiné aux développeurs maîtrisant C# et souhaitant écrire du code fiable pour .NET.

\n\n

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

\n

De nombreux développeurs utilisent DateTime par défaut, mais dans le monde moderne des systèmes distribués, ce n'est souvent pas le meilleur choix. Examinons les différences clés.

\n\n

DateTime vs DateTimeOffset

\n

DateTime stocke un instant dans le temps sans lien explicite avec un fuseau horaire. Vous pouvez spécifier Kind (Local, Utc, Unspecified), mais ce n'est qu'une étiquette, pas une information complète sur le décalage. DateTimeOffset, quant à lui, stocke toujours le décalage par rapport à UTC, ce qui le rend univoque et préférable pour le stockage dans les bases de données et les API.

\n
// DateTime — peut induire en erreur\nDateTime localNow = DateTime.Now; // Kind = Local\nDateTime utcNow = DateTime.UtcNow; // Kind = Utc\n\n// DateTimeOffset — toujours un décalage explicite\nDateTimeOffset preciseNow = DateTimeOffset.Now; // +03:00 (exemple)\nDateTimeOffset utcOffset = DateTimeOffset.UtcNow; // +00:00\n\n// Conversion entre eux\nDateTimeOffset fromDateTime = new DateTimeOffset(2024, 12, 25, 10, 0, 0, TimeSpan.FromHours(3));\nConsole.WriteLine(fromDateTime.Offset); // 03:00:00\n
\n

Recommandation : Pour stocker un instant dans le temps (par exemple, la date de création d'un enregistrement), utilisez DateTimeOffset. Pour l'affichage à l'utilisateur en heure locale, convertissez au niveau de la présentation.

\n\n

TimeSpan pour les intervalles

\n

TimeSpan ne stocke pas une date, mais seulement un intervalle de temps. C'est un outil indispensable pour l'arithmétique des dates et la mesure de la durée des opérations.

\n
DateTimeOffset start = DateTimeOffset.UtcNow;\n// ... un processus long ...\nDateTimeOffset end = DateTimeOffset.UtcNow;\n\nTimeSpan duration = end - start;\nConsole.WriteLine($"L'opération a pris {duration.TotalMilliseconds} ms");\n// Création d'un intervalle\nTimeSpan workDay = new TimeSpan(8, 0, 0); // 8 heures\nDateTimeOffset deadline = DateTimeOffset.UtcNow.Add(workDay);\n
\n\n

2. Analyse et formatage : culture, ISO 8601 et performance

\n

Une analyse incorrecte est une source de bogues dans les applications qui travaillent avec différents paramètres régionaux. Examinons les méthodes avancées.

\n\n

ParseExact et TryParseExact

\n

Utilisez ParseExact pour les chaînes avec un format connu et strict. Cela améliore la fiabilité et la lisibilité du code.

\n
string dateString = "2024-12-25T10:30:00+03:00";\n// ISO 8601 — format universel\nDateTimeOffset parsed = DateTimeOffset.ParseExact(\n    dateString,\n    "yyyy-MM-dd'T'HH:mm:sszzz",\n    CultureInfo.InvariantCulture\n);\nConsole.WriteLine(parsed); // 25.12.2024 10:30:00 +03:00\n\n// Analyse sécurisée avec TryParseExact\nif (DateTimeOffset.TryParseExact(\n    "2024/12/25",\n    new[] { "yyyy/MM/dd", "dd.MM.yyyy" },\n    CultureInfo.InvariantCulture,\n    DateTimeStyles.None,\n    out DateTimeOffset result))\n{\n    Console.WriteLine($"Analysé avec succès : {result}");\n}\n
\n

Conseil : Pour stocker les dates dans les journaux et les API, utilisez toujours le format ISO 8601 (spécificateur "o"). Cela garantit une lecture univoque par tout système.

\n\n

Formatage tenant compte de la culture

\n

Lors de l'affichage à l'utilisateur, tenez compte de sa locale, mais pour les échanges internes, utilisez l'invariant

Blogs

Book Recommendations