CodeGym /Cursos /C# SELF /Tipos útiles: DateOnly y TimeOnly

Tipos útiles: DateOnly y TimeOnly

C# SELF
Nivel 15 , Lección 1
Disponible

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?
DateTime
🚫 Casi para todo (pero no siempre es cómodo ni seguro)
DateTimeOffset
Cuando necesitas el momento exacto y la zona horaria
DateOnly
🚫 🚫 Cumpleaños, fechas sin hora
TimeOnly
🚫 🚫 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);
Crear una fecha de cumpleaños usando DateOnly

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.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION