CodeGym /Corsi /C# SELF /Tipi utili: DateOnly e TimeOnly

Tipi utili: DateOnly e TimeOnly

C# SELF
Livello 15 , Lezione 1
Disponibile

1. Introduzione

Prima in C# non c’era un tipo separato solo per la data o solo per l’ora. Quindi, anche se ti serviva solo la data — tipo la data di nascita — dovevi usare DateTime e aggiungere "l’orario di default". Il vecchio modo di salvare solo la data tramite DateTime:


DateTime birthday = new DateTime(1985, 4, 20); // 20 aprile 1985, 00:00:00

Ma non è comodo. Vorresti solo la data, ma ti becchi pure l’ora — anche se è zero. Questo può confondere: ad esempio, quando confronti le date il programma può considerare anche l’ora e ti ritrovi con risultati strani.

Stessa storia al contrario: se lavori solo con l’ora (tipo orario di lavoro dalle 08:00 alle 17:00), comunque dovevi "inventarti" una data, anche se non ti serve a nulla.

Ora in .NET ci sono i tipi speciali DateOnly e TimeOnly che ti liberano da questa confusione.

Nuovi tipi utili DateOnly e TimeOnly

  • DateOnly — solo la data del calendario, senza ora e senza info sul fuso orario.
  • TimeOnly — solo l’ora del giorno, senza anno, mese, giorno e, di nuovo, senza fuso orario.

Tabella di confronto dei tipi di tempo

Tipo Data Ora Fuso orario Per cosa si usa?
DateTime
🚫 Quasi tutto (ma non sempre comodo e sicuro)
DateTimeOffset
Quando ti serve sia il momento preciso che il fuso orario
DateOnly
🚫 🚫 Date di nascita, date senza ora
TimeOnly
🚫 🚫 Orari di lavoro, orari, intervalli durante il giorno

2. Lavorare con DateOnly

Dichiarazione e creazione

Creare un oggetto DateOnly — come iniziare una nuova abitudine: facile e veloce! Per esempio:

// Anno, mese, giorno
DateOnly birthday = new DateOnly(1985, 4, 20);
Creazione della data di nascita con DateOnly

Puoi usare DateOnly.FromDateTime se hai già un oggetto DateTime:

DateTime now = DateTime.Now;
DateOnly today = DateOnly.FromDateTime(now);
// ora today contiene solo la data, l’ora è buttata via

Proprietà e metodi principali

  • Year, Month, Day — come sei abituato con DateTime.
  • .ToString() — formatta la data, puoi scegliere il formato che vuoi.
Console.WriteLine($"Data di nascita: {birthday.Year} anno, {birthday.Month} mese, {birthday.Day} giorno.");

Console.WriteLine(today.ToString("dd.MM.yyyy")); // Tipo, 30.07.2024

Aritmetica delle date

Puoi aggiungere facilmente giorni/mesi/anni:

DateOnly tomorrow = today.AddDays(1);
DateOnly nextMonth = today.AddMonths(1);

Prova nel tuo progetto principale a sostituire i campi di tipo DateTime che tengono solo la data con DateOnly — sarai un passo più vicino al .NET moderno!

Confronto tra date

Funziona il confronto con <, >, ==:

if (birthday < today)
    Console.WriteLine("Il compleanno è già passato quest’anno o da un po’ :)");

Niente più errori con millisecondi o minuti di troppo.

Ottenere la data di oggi

DateOnly currentDate = DateOnly.FromDateTime(DateTime.Now);

3. Lavorare con TimeOnly

Ora vediamo l’ora senza la data — chi di noi programmatori non ha mai avuto a che fare con gli orari di pranzo?

Creare TimeOnly

TimeOnly startWork = new TimeOnly(9, 0);    // 09:00
TimeOnly endWork = new TimeOnly(17, 30);    // 17:30

Possiamo prendere solo ore, minuti, secondi:

Console.WriteLine($"Giornata lavorativa: dalle {startWork.Hour}:{startWork.Minute:D2} alle {endWork.Hour}:{endWork.Minute:D2}");

Ottenere l’ora da DateTime

DateTime now = DateTime.Now;
TimeOnly currentTime = TimeOnly.FromDateTime(now);
Console.WriteLine($"Adesso è {currentTime}");

Aritmetica dell’ora

TimeOnly breakStart = startWork.AddHours(4); // pausa dopo 4 ore, cioè alle 13:00
TimeOnly breakEnd = breakStart.AddMinutes(30); // 30 minuti di pranzo

Confronti e controlli

if (currentTime >= startWork && currentTime <= endWork)
    Console.WriteLine("È ora di lavorare :)");
else
    Console.WriteLine("Si può rilassarsi.");

4. Interazione con altri tipi

Conversione tra DateOnly, TimeOnly e DateTime

A volte ti serve di nuovo un DateTime (tipo per salvarlo in un vecchio database o per compatibilità):


DateOnly datePart = new DateOnly(2024, 7, 30);
TimeOnly timePart = new TimeOnly(14, 15);
DateTime datetime = datePart.ToDateTime(timePart); // 2024-07-30 14:15:00

E viceversa:

DateTime dt = DateTime.Now;
DateOnly justDate = DateOnly.FromDateTime(dt);
TimeOnly justTime = TimeOnly.FromDateTime(dt);

Cose importanti e errori tipici

  • Se provi a fare il parse solo della data o solo dell’ora con i vecchi metodi tipo DateTime.Parse(), probabilmente avrai un errore o qualcosa di strano. Per questi casi ci sono metodi apposta: usa DateOnly.Parse() e TimeOnly.Parse() — loro sanno come gestire i valori "tagliati".
  • Importante: DateOnly e TimeOnly non hanno nessuna idea dei fusi orari. Sono solo data o solo ora — senza legame col fuso. Se ti serve il fuso, salvalo a parte.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION