Trabajo con fechas en C# (.NET): revisión completa de bibliotecas y herramientas integradas
El manejo de fechas y horas es una de las tareas más comunes en el desarrollo. En el ecosistema C# (.NET) existe tanto una potente funcionalidad integrada (System.DateTime) como bibliotecas de terceros que simplifican escenarios complejos: trabajo con zonas horarias, formato, intervalos y análisis sintáctico. En este artículo analizaremos las herramientas principales, incluyendo las capacidades modernas de .NET 6+ y los paquetes NuGet populares.
1. Herramientas integradas: DateTime, DateOnly, TimeOnly
La clase base System.DateTime está disponible desde las primeras versiones de .NET. Soporta:
- Creación de fechas:
new DateTime(2025, 3, 15) - Aritmética:
date.AddDays(10),date.AddMonths(-1) - Comparación:
date1 > date2 - Formato:
date.ToString("yyyy-MM-dd")
A partir de .NET 6, aparecieron los tipos DateOnly y TimeOnly — no están vinculados a una zona horaria y almacenan solo la fecha o solo la hora. Esto es útil para cumpleaños, horarios de trabajo y agendas.
using System;
DateOnly birthday = new DateOnly(1990, 5, 20);TimeOnly alarm = new TimeOnly(7, 30);
Console.WriteLine($"Fecha: {birthday}, Hora: {alarm}");// Salida: Fecha: 20.05.1990, Hora: 07:302. TimeSpan — intervalos de tiempo
Para trabajar con intervalos de tiempo se utiliza TimeSpan. Permite calcular la diferencia entre fechas, la duración de operaciones y tiempos de espera.
DateTime start = DateTime.Now;// ... ejecución del código ...DateTime end = DateTime.Now;
TimeSpan elapsed = end - start;Console.WriteLine($"Transcurrido: {elapsed.TotalSeconds} seg.");3. Noda Time — trabajo avanzado con fechas
Noda Time (NuGet: NodaTime) es una biblioteca de Jon Skeet (autor de un libro popular sobre C#). Resuelve los problemas de DateTime:
- Separación clara entre "instante en el tiempo" (
Instant), "fecha en el calendario" (LocalDate) y "hora con zona horaria" (ZonedDateTime). - Soporte de calendarios (islámico, hebreo, japonés).
- Inmutabilidad de todos los tipos.
- Manejo correcto de zonas horarias a través de la base de datos IANA (tzdata).
using NodaTime;
Instant now = SystemClock.Instance.GetCurrentInstant();DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(zone);
Console.WriteLine($"Hora actual en Moscú: {moscowTime:yyyy-MM-dd HH:mm}");
// Trabajo con LocalDateLocalDate today = LocalDate.FromDateTime(DateTime.Today);LocalDate nextWeek = today.PlusDays(7);Noda Time es especialmente útil en proyectos donde la precisión de las zonas horarias es crítica (registros, reservas, sistemas internacionales).
4. Humanizer — fechas legibles para humanos
Humanizer (NuGet: Humanizer.Core) es una biblioteca para convertir números, fechas y horas a lenguaje natural. Puede:
- Mostrar tiempo relativo: "hace 3 minutos", "dentro de 2 días".
- Declinar nombres de meses y días de la semana.
- Formatear intervalos de tiempo: "1 hora 30 minutos".
using Humanizer;
DateTime pastDate = DateTime.UtcNow.AddHours(-5);Console.WriteLine(pastDate.Humanize()); // "hace 5 horas"
TimeSpan span = new TimeSpan(2, 45, 0);Console.WriteLine(span.Humanize()); // "2 horas 45 minutos"Humanizer soporta localización (idioma ruso — Humanizer.Core.ru).
5. FluentDateTime — interfaz fluida para DateTime
FluentDateTime (NuGet: FluentDateTime) — agrega métodos de extensión para una