Introducción al trabajo con fechas y horas en C#
Trabajar con fechas y horas es una de las tareas fundamentales en el desarrollo de software. Ya sea para registro de eventos, cálculo de plazos, creación de informes o trabajo con bases de datos, saber gestionar correctamente los datos temporales es críticamente importante. En C# (plataforma .NET), existe un conjunto de herramientas potente y flexible para estos fines, que incluye las estructuras DateTime, TimeSpan y DateTimeOffset.
En este artículo, analizaremos en detalle todos los aspectos clave del trabajo con fechas y horas en C#. Aprenderá a crear, formatear, comparar y manipular datos temporales, además de conocer las mejores prácticas que le ayudarán a evitar errores comunes.
Estructuras principales: DateTime, TimeSpan y DateTimeOffset
Estructura DateTime
DateTime es la estructura principal para representar un momento en el tiempo (fecha + hora). Puede representar valores desde el 01.01.0001 hasta el 31.12.9999.
Creación de un objeto DateTime:
// Fecha y hora actualesDateTime now = DateTime.Now;DateTime utcNow = DateTime.UtcNow;
// Fecha y hora específicasDateTime specificDate = new DateTime(2025, 3, 15, 14, 30, 0); // 15 de marzo de 2025, 14:30:00
// Análisis desde una cadenaDateTime parsedDate = DateTime.Parse("2025-03-15");
// Uso de TryParse para un análisis seguroif (DateTime.TryParse("2025-03-15", out DateTime result)){ Console.WriteLine($"Analizado exitosamente: {result}");}Propiedades y métodos principales:
Date— devuelve solo la fecha (hora = 00:00:00)Year,Month,Day,Hour,Minute,Second— componentes individualesDayOfWeek— día de la semana (enum)AddDays(),AddMonths(),AddYears()— aritmética con fechasAddHours(),AddMinutes(),AddSeconds()— aritmética con horas
Estructura TimeSpan
TimeSpan representa un intervalo de tiempo (período entre dos momentos). No es una fecha, sino una duración.
// Creación de TimeSpanTimeSpan interval = new TimeSpan(2, 15, 30); // 2 horas, 15 minutos, 30 segundos
// Diferencia entre dos fechasDateTime start = new DateTime(2025, 1, 1);DateTime end = new DateTime(2025, 1, 10);TimeSpan difference = end - start; // 9 días
// Propiedades de TimeSpanConsole.WriteLine($"Días: {difference.Days}"); // 9Console.WriteLine($"Total de horas: {difference.TotalHours}"); // 216Console.WriteLine($"Total de minutos: {difference.TotalMinutes}"); // 12960
// Aritmética con TimeSpanTimeSpan workDay = new TimeSpan(8, 0, 0); // 8 horasTimeSpan breakTime = new TimeSpan(1, 0, 0); // 1 horaTimeSpan actualWork = workDay - breakTime; // 7 horasEstructura DateTimeOffset
DateTimeOffset es una versión mejorada de DateTime que tiene en cuenta el desplazamiento respecto a UTC. Esto es críticamente importante para aplicaciones que trabajan con usuarios de diferentes zonas horarias.
// Hora actual teniendo en cuenta la zona horariaDateTimeOffset nowOffset = DateTimeOffset.Now;
// Creación especificando el desplazamientoDateTimeOffset withOffset = new DateTimeOffset(2025, 3, 15, 14, 0, 0, TimeSpan.FromHours(3));
// Conversión entre zonas horariasDateTimeOffset utc = withOffset.ToUniversalTime();DateTimeOffset local = withOffset.ToLocalTime();
// Obtención del desplazamientoConsole.WriteLine($"Desplazamiento: {withOffset.Offset}"); // +03:00¿Cuándo usar DateTimeOffset en lugar de DateTime? Si su aplicación trabaja con usuarios de diferentes zonas horarias o almacena datos en UTC, use DateTimeOffset. Esto previene