1. Introducción
Antes en C# no había un tipo separado solo para la fecha o solo para la hora. Así que, incluso si solo necesitabas guardar la fecha — por ejemplo, un cumpleaños — tenías que usar DateTime y añadir una "hora por defecto". La forma antigua de guardar solo la fecha usando DateTime:
DateTime birthday = new DateTime(1985, 4, 20); // 20 de abril de 1985, 00:00:00
Pero eso es incómodo. Tú solo quieres la fecha, pero también te llevas la hora — aunque sea cero. Eso puede confundir: por ejemplo, al comparar fechas el programa puede tener en cuenta la hora y te llevas resultados inesperados.
Lo mismo pasa al revés: si solo trabajas con la hora (por ejemplo, un horario de trabajo de 08:00 a 17:00), igual tenías que "inventar" una fecha, aunque no importara para nada.
Ahora en .NET existen los tipos especiales DateOnly y TimeOnly, que te salvan de ese lío.
Nuevos tipos útiles DateOnly y TimeOnly
- DateOnly — solo la fecha del calendario, sin hora y sin información de zona horaria.
- TimeOnly — solo la hora del día, sin año, mes, día y, otra vez, sin zona horaria.
Tabla comparativa de tipos de tiempo
| Tipo | Fecha | Hora | Zona horaria | ¿Para qué se usa? |
|---|---|---|---|---|
|
✅ | ✅ | 🚫 | Casi para todo (pero no siempre es cómodo ni seguro) |
|
✅ | ✅ | ✅ | Cuando necesitas el momento exacto y la zona horaria |
|
✅ | 🚫 | 🚫 | Cumpleaños, fechas sin hora |
|
🚫 | ✅ | 🚫 | Horarios de trabajo, agendas, intervalos durante el día |
2. Trabajando con DateOnly
Declaración y creación
Crear un objeto DateOnly es como pillar un nuevo hábito: ¡fácil y rápido! Por ejemplo:
// Año, mes, día
DateOnly birthday = new DateOnly(1985, 4, 20);
Puedes usar DateOnly.FromDateTime si ya tienes un objeto DateTime:
DateTime now = DateTime.Now;
DateOnly today = DateOnly.FromDateTime(now);
// ahora today solo tiene la fecha, la hora se descarta
Propiedades y métodos principales
- Year, Month, Day — igual que en DateTime.
- .ToString() — formatea la fecha, puedes poner tu propio formato.
Console.WriteLine($"Fecha de cumpleaños: {birthday.Year} año, {birthday.Month} mes, {birthday.Day} día.");
Console.WriteLine(today.ToString("dd.MM.yyyy")); // Por ejemplo, 30.07.2024
Aritmética de fechas
Puedes sumar días/meses/años fácilmente:
DateOnly tomorrow = today.AddDays(1);
DateOnly nextMonth = today.AddMonths(1);
Prueba en tu app principal cambiar los campos de tipo DateTime que solo guardan la fecha por DateOnly — ¡vas a estar un paso más cerca del .NET moderno!
Comparando fechas
Funciona la comparación con <, >, ==:
if (birthday < today)
Console.WriteLine("El cumple ya fue este año o hace tiempo :)");
Ya no habrá errores por milisegundos o minutos de más.
Obtener el día de hoy
DateOnly currentDate = DateOnly.FromDateTime(DateTime.Now);
3. Trabajando con TimeOnly
Ahora vamos con la hora sin fecha — porque ¿quién de los programadores no ha lidiado con horarios de comida?
Crear TimeOnly
TimeOnly startWork = new TimeOnly(9, 0); // 09:00
TimeOnly endWork = new TimeOnly(17, 30); // 17:30
Podemos sacar solo las horas, minutos, segundos:
Console.WriteLine($"Jornada laboral: de {startWork.Hour}:{startWork.Minute:D2} a {endWork.Hour}:{endWork.Minute:D2}");
Obtener la hora desde DateTime
DateTime now = DateTime.Now;
TimeOnly currentTime = TimeOnly.FromDateTime(now);
Console.WriteLine($"Ahora son las {currentTime}");
Aritmética de tiempo
TimeOnly breakStart = startWork.AddHours(4); // pausa después de 4 horas, o sea a las 13:00
TimeOnly breakEnd = breakStart.AddMinutes(30); // 30 minutos de comida
Comparaciones y comprobaciones
if (currentTime >= startWork && currentTime <= endWork)
Console.WriteLine("¡Hora de currar :)");
else
Console.WriteLine("Puedes descansar.");
4. Interacción con otros tipos
Conversión entre DateOnly, TimeOnly y DateTime
A veces necesitas volver a tener un DateTime (por ejemplo, para guardar en una base antigua o por compatibilidad):
DateOnly datePart = new DateOnly(2024, 7, 30);
TimeOnly timePart = new TimeOnly(14, 15);
DateTime datetime = datePart.ToDateTime(timePart); // 2024-07-30 14:15:00
Y al revés:
DateTime dt = DateTime.Now;
DateOnly justDate = DateOnly.FromDateTime(dt);
TimeOnly justTime = TimeOnly.FromDateTime(dt);
Cosas importantes y errores típicos
- Si intentas parsear solo la fecha o solo la hora usando métodos antiguos como DateTime.Parse(), probablemente te salga un error o algo raro. Para eso hay métodos especiales: usa DateOnly.Parse() y TimeOnly.Parse() — ellos sí saben cómo tratar valores "recortados".
- Es importante entender: DateOnly y TimeOnly no tienen ni idea de zonas horarias. Es solo la fecha o solo la hora — sin relación con la zona. Si necesitas tener en cuenta zonas, guarda esa info aparte.
GO TO FULL VERSION