Trabajo con fechas en C# (.NET): desde herramientas integradas hasta bibliotecas especializadas
Trabajar con fechas y horas es una de las tareas clave en el desarrollo de cualquier aplicación: desde servicios web hasta utilidades de escritorio. La plataforma .NET proporciona potentes herramientas integradas, como DateTime, DateTimeOffset y TimeSpan. Sin embargo, en escenarios complejos (trabajo con zonas horarias, intervalos legibles por humanos, análisis de formatos no estándar), los desarrolladores suelen recurrir a bibliotecas de terceros. En este artículo, analizaremos las herramientas principales para trabajar con fechas en C#.
1. Herramientas integradas de .NET
Tipos básicos para trabajar con fechas en .NET:
DateTime— representa un momento en el tiempo (fecha + hora). Soporta operaciones de suma, resta y comparación.DateTimeOffset— similar a DateTime, pero con indicación explícita del desplazamiento respecto a UTC. Se recomienda para almacenar fechas en sistemas distribuidos.TimeSpan— intervalo de tiempo (por ejemplo, 2 horas 30 minutos).DateOnlyyTimeOnly(desde .NET 6) — para almacenar por separado fecha y hora sin datos adicionales.
Ejemplo de uso de DateTime:
using System;
DateTime now = DateTime.Now;DateTime utcNow = DateTime.UtcNow;DateTime specificDate = new DateTime(2025, 3, 15, 14, 30, 0);
// Formateostring formatted = now.ToString("dd.MM.yyyy HH:mm:ss");Console.WriteLine(formatted); // 15.03.2025 14:30:00
// AritméticaDateTime tomorrow = now.AddDays(1);TimeSpan diff = tomorrow - now;Console.WriteLine($"Hasta mañana: {diff.TotalHours} horas");Análisis de fechas desde cadenas:
string dateStr = "2025-03-15";if (DateTime.TryParse(dateStr, out DateTime result)){ Console.WriteLine(result.ToShortDateString());}
// Análisis con especificación de culturavar culture = new System.Globalization.CultureInfo("ru-RU");DateTime parsed = DateTime.Parse("15 de marzo de 2025", culture);2. Noda Time — trabajo avanzado con fechas y horas
Noda Time — una biblioteca alternativa de la comunidad, creada para eliminar las deficiencias del DateTime integrado. Principales características:
- Separación clara de conceptos: Instant (momento en UTC), LocalDateTime (fecha+hora sin zona horaria), ZonedDateTime (con zona horaria).
- Soporte completo de zonas horarias a través de la base de datos IANA (Olson).
- Tipos inmutables (immutable) — seguros en código multiproceso.
- Intervalos legibles por humanos (
Period): 2 años, 3 meses, 5 días.
Ejemplo de trabajo con Noda Time:
using NodaTime;using NodaTime.Text;
// Momento actual en UTCInstant now = SystemClock.Instance.GetCurrentInstant();Console.WriteLine($"Instant: {now}");
// Conversión a hora local con zona horariaDateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/Moscow"];ZonedDateTime moscowTime = now.InZone(zone);Console.WriteLine($"Hora en Moscú: {moscowTime}");
// Análisis de fecha en un formato específicovar pattern = LocalDatePattern.CreateWithInvariantCulture("yyyy-MM-dd");LocalDate date = pattern.Parse("2025-03-15").Value;Console.WriteLine(date); // 15 de marzo de 2025
// Trabajo con periodosLocalDate start = new LocalDate(2025, 1, 1);LocalDate end = new LocalDate(2025, 12, 31);Period period = Period.Between(start, end, PeriodUnits.Days);Console.WriteLine($"Días entre fechas: {period.Days}");3. Humanizer — fechas e intervalos legibles por humanos
Humanizer — biblioteca para convertir números, fechas y cadenas a un formato amigable para humanos. En el contexto de fechas,
También en la biblioteca
gRPC para Swift (iOS/macOS): bibliotecas, configuración y ejemplos
vcpkg para C++: guía completa con ejemplos prácticos
Mockery para PHP: guía completa con ejemplos prácticos