Trabajo con fechas en C# (.NET): herramientas integradas y bibliotecas populares
Trabajar con fechas y horas es una de las tareas clave en cualquier desarrollo serio. En el ecosistema de C# (.NET), existen tanto potentes tipos integrados (DateTime, DateTimeOffset, TimeSpan) como bibliotecas de terceros que simplifican operaciones complejas: manejo de husos horarios, representación legible para humanos, análisis de formatos no estándar. En este artículo, analizaremos en detalle las principales herramientas para trabajar con fechas en C#.
Tipos integrados de .NET
La clase base System.DateTime proporciona métodos para crear, comparar, realizar aritmética y formatear fechas. Admite un rango desde el 01.01.0001 hasta el 31.12.9999.
// Creación de fechaDateTime now = DateTime.Now; // hora localDateTime utcNow = DateTime.UtcNow; // UTCDateTime specific = new DateTime(2025, 3, 15, 14, 30, 0);
// AritméticaDateTime tomorrow = now.AddDays(1);TimeSpan diff = tomorrow - now;Console.WriteLine(diff.TotalHours); // 24
// Análisisstring dateStr = "2025-12-31";DateTime parsed = DateTime.Parse(dateStr, CultureInfo.InvariantCulture);
// FormateoConsole.WriteLine(now.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30DateTimeOffset es una versión mejorada que almacena el desplazamiento respecto a UTC. Se recomienda para aplicaciones que trabajan con diferentes husos horarios.
DateTimeOffset nowOffset = DateTimeOffset.Now;Console.WriteLine(nowOffset.Offset); // +03:00 (depende del sistema)TimeSpan — para representar intervalos de tiempo. Ideal para medir la duración de operaciones.
TimeSpan duration = new TimeSpan(2, 15, 30); // 2 horas 15 minutos 30 segundosConsole.WriteLine(duration.TotalMinutes); // 135.5Biblioteca NodaTime
NodaTime es una biblioteca alternativa para trabajar con fechas y horas, creada por Jon Skeet (autor de libros sobre C#). Resuelve muchos problemas de DateTime, como la ambigüedad y la falta de tipado estricto en las zonas horarias.
Instalación mediante NuGet:
dotnet add package NodaTimeTipos principales:
Instant— un momento en el tiempo (análogo a Unix timestamp)LocalDateTime— fecha+hora sin vinculación a un huso horarioZonedDateTime— fecha+hora en un huso horario específicoDurationyPeriod— intervalos (análogo a TimeSpan, pero Period considera unidades de calendario)
using NodaTime;
// Momento actual en UTCInstant now = SystemClock.Instance.GetCurrentInstant();Console.WriteLine(now.ToDateTimeUtc()); // se puede convertir a DateTime
// Trabajo con husos horariosDateTimeZone tz = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(tz);Console.WriteLine(moscowTime); // 2025-03-15T17:30:00 Europe/Moscow (+03)
// Period — diferencia en unidades de calendarioLocalDate start = new LocalDate(2024, 1, 1);LocalDate end = new LocalDate(2025, 3, 15);Period period = Period.Between(start, end);Console.WriteLine($"Pasaron {period.Years} años, {period.Months} meses, {period.Days} días");// Pasaron 1 años, 2 meses, 14 díasVentajas de NodaTime: tipado estricto, manejo correcto de husos horarios históricos, soporte de calendarios (islámico, hebreo, etc.), sin ambigüedades en cambios de hora.
Biblioteca Humanizer
Humanizer es una biblioteca para "humanizar" datos, incluyendo fechas e intervalos. Permite mostrar fechas de forma legible: "ayer", "dentro de 3 horas", "hace 2 días".
Instalación:
dotnet add package HumanizerEjemplos de uso