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? |
|---|---|---|---|---|
|
✅ | ✅ | 🚫 | Quasi tutto (ma non sempre comodo e sicuro) |
|
✅ | ✅ | ✅ | Quando ti serve sia il momento preciso che il fuso orario |
|
✅ | 🚫 | 🚫 | Date di nascita, date senza ora |
|
🚫 | ✅ | 🚫 | 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);
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.
GO TO FULL VERSION