Introducción: Por qué trabajar con fechas y horas en C# es fundamental para cualquier desarrollador
Cada desarrollador de C# tarde o temprano se enfrenta a la necesidad de procesar fechas y horas. Ya sea para el registro de eventos, el cálculo de plazos en una aplicación empresarial o simplemente mostrar la fecha actual en pantalla, no se puede prescindir de un dominio seguro de DateTime y TimeSpan. En este artículo, analizaremos todos los aspectos clave: desde la creación de objetos hasta el trabajo con zonas horarias y rendimiento. El material es adecuado tanto para principiantes como para programadores experimentados que deseen sistematizar sus conocimientos.
Tipos principales para trabajar con fecha y hora en .NET
En .NET existen varios tipos, cada uno de los cuales resuelve su propia tarea. Veamos los principales.
DateTime — la base fundamental
DateTime es una estructura que representa un momento en el tiempo (fecha y hora). Admite un rango desde el 01.01.0001 hasta el 31.12.9999. Se puede crear un objeto de varias maneras:
// Fecha y hora actualesDateTime now = DateTime.Now;// Fecha y hora actuales en UTCDateTime utcNow = DateTime.UtcNow;// Fecha específicaDateTime specificDate = new DateTime(2025, 3, 15);// Fecha y hora con precisión de segundosDateTime withTime = new DateTime(2025, 3, 15, 14, 30, 0);// Fecha de hoy (hora 00:00:00)DateTime today = DateTime.Today;TimeSpan — intervalos de tiempo
TimeSpan representa un intervalo de tiempo (la diferencia entre dos fechas). Es útil para calcular la duración de operaciones:
// Creación de un intervaloTimeSpan interval = new TimeSpan(2, 5, 30); // 2 horas, 5 minutos, 30 segundos// Diferencia entre fechasDateTime start = DateTime.Now;System.Threading.Thread.Sleep(1000); // simulación de trabajoDateTime end = DateTime.Now;TimeSpan duration = end - start;Console.WriteLine($"Pasaron {duration.TotalSeconds} segundos");DateTimeOffset — fecha con zona horaria
Para aplicaciones modernas que trabajan con usuarios de diferentes regiones, DateTimeOffset es fundamental. Almacena la fecha y la hora junto con el desplazamiento de UTC:
// Hora actual con desplazamiento localDateTimeOffset localOffset = DateTimeOffset.Now;// Hora con un desplazamiento específicoDateTimeOffset customOffset = new DateTimeOffset(2025, 3, 15, 12, 0, 0, TimeSpan.FromHours(3));// Conversión a UTCDateTime utc = localOffset.UtcDateTime;Formato y análisis de fechas
La visualización correcta de las fechas al usuario y la lectura de datos desde cadenas son habilidades obligatorias.
Formato: ToString() y patrones personalizados
El método ToString() acepta una cadena de formato. Los formatos estándar más populares son:
"d"— fecha corta (15.03.2025)"D"— fecha completa (15 de marzo de 2025)"t"— hora corta (14:30)"T"— hora completa (14:30:00)"g"— formato general fecha/hora (15.03.2025 14:30)
Ejemplos de formato personalizado:
DateTime dt = new DateTime(2025, 3, 15, 14, 30, 45);Console.WriteLine(dt.ToString("yyyy-MM-dd")); // 2025-03-15Console.WriteLine(dt.ToString("dd.MM.yyyy HH:mm")); // 15.03.2025 14:30Console.WriteLine(dt.ToString("dddd, MMMM yyyy")); // sábado, marzo 2025 (depende de la cultura)Análisis: conversión de cadena a fecha
Para un análisis confiable, use DateTime.TryParse o DateTime.ParseExact:
string dateString = "15.03.2025";if (DateTime.TryParse(dateString, out DateTime result)){ Console.WriteLine($"Éxito: {result}");}else{ Console.WriteLine("Error de análisis");}
// Análisis exacto con especificación de formatostring exactString = "2025-03-15 14:30:00";DateTime parsed = DateTime.ParseExact(exactString, "yyyy-MM-dd HH:mm