Travail avec les dates en C# (.NET) : outils intégrés et bibliothèques populaires
Le travail avec les dates et l'heure est l'une des tâches clés dans tout développement sérieux. Dans l'écosystème C# (.NET), il existe à la fois des types intégrés puissants (DateTime, DateTimeOffset, TimeSpan) et des bibliothèques tierces qui simplifient les opérations complexes — la gestion des fuseaux horaires, la représentation lisible par l'homme, l'analyse de formats non standard. Dans cet article, nous allons détailler les principaux outils pour travailler avec les dates en C#.
Types intégrés .NET
La classe de base System.DateTime fournit des méthodes pour la création, la comparaison, l'arithmétique et le formatage des dates. Elle prend en charge une plage allant du 01.01.0001 au 31.12.9999.
// Création d'une dateDateTime now = DateTime.Now; // heure localeDateTime utcNow = DateTime.UtcNow; // UTCDateTime specific = new DateTime(2025, 3, 15, 14, 30, 0);
// ArithmétiqueDateTime tomorrow = now.AddDays(1);TimeSpan diff = tomorrow - now;Console.WriteLine(diff.TotalHours); // 24
// Analysestring dateStr = "2025-12-31";DateTime parsed = DateTime.Parse(dateStr, CultureInfo.InvariantCulture);
// FormatageConsole.WriteLine(now.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30DateTimeOffset est une version améliorée qui stocke le décalage par rapport à UTC. Il est recommandé pour les applications travaillant avec différents fuseaux horaires.
DateTimeOffset nowOffset = DateTimeOffset.Now;Console.WriteLine(nowOffset.Offset); // +03:00 (dépend du système)TimeSpan — pour représenter des intervalles de temps. Idéal pour mesurer la durée des opérations.
TimeSpan duration = new TimeSpan(2, 15, 30); // 2 heures 15 minutes 30 secondesConsole.WriteLine(duration.TotalMinutes); // 135.5Bibliothèque NodaTime
NodaTime est une bibliothèque alternative pour travailler avec les dates et l'heure, créée par Jon Skeet (auteur de livres sur C#). Elle résout de nombreux problèmes de DateTime, tels que l'ambiguïté et l'absence de typage strict des fuseaux horaires.
Installation via NuGet :
dotnet add package NodaTimeTypes principaux :
Instant— un moment dans le temps (équivalent d'un timestamp Unix)LocalDateTime— date+heure sans référence à un fuseau horaireZonedDateTime— date+heure dans un fuseau horaire spécifiqueDurationetPeriod— intervalles (équivalent de TimeSpan, mais Period prend en compte les unités calendaires)
using NodaTime;
// Moment actuel en UTCInstant now = SystemClock.Instance.GetCurrentInstant();Console.WriteLine(now.ToDateTimeUtc()); // peut être converti en DateTime
// Travail avec les fuseaux horairesDateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(tz);Console.WriteLine(moscowTime); // 2025-03-15T17:30:00 Europe/Moscow (+03)
// Period — différence en unités calendairesLocalDate start = new LocalDate(2024, 1, 1);LocalDate end = new LocalDate(2025, 3, 15);Period period = Period.Between(start, end);Console.WriteLine($"Il s'est écoulé {period.Years} ans, {period.Months} mois, {period.Days} jours");// Il s'est écoulé 1 ans, 2 mois, 14 joursAvantages de NodaTime : typage strict, gestion correcte des fuseaux horaires historiques, prise en charge des calendriers (islamique, hébraïque, etc.), absence d'ambiguïtés lors du changement d'heure.
Bibliothèque Humanizer
Humanizer est une bibliothèque pour « humaniser » les données, y compris les dates et les intervalles. Elle permet d'afficher les dates de manière lisible : « hier », « dans 3 heures », « il y a 2 jours ».
Installation :
dotnet add package HumanizerExemples d'util