1. Introduction
Avant, en C#, il n’y avait pas de type séparé juste pour la date ou juste pour l’heure. Donc, même si tu voulais juste stocker une date — genre une date d’anniversaire — tu devais utiliser DateTime et rajouter "l’heure par défaut". Ancienne façon de stocker juste une date avec DateTime :
DateTime birthday = new DateTime(1985, 4, 20); // 20 avril 1985, 00:00:00
Mais c’est pas pratique. Tu veux juste une date, mais tu te retrouves avec l’heure aussi — même si c’est zéro. Ça peut embrouiller : par exemple, quand tu compares des dates, le programme peut prendre en compte l’heure, et tu peux avoir des résultats chelous.
Même galère dans l’autre sens : si tu bosses juste avec l’heure (genre un planning de travail de 08:00 à 17:00), tu devais quand même "inventer" une date, alors qu’on s’en fiche complètement.
Maintenant, dans .NET, il y a des types spéciaux DateOnly et TimeOnly qui évitent toute cette confusion.
Nouveaux types pratiques DateOnly et TimeOnly
- DateOnly — juste une date de calendrier, sans heure et sans info de fuseau horaire.
- TimeOnly — juste l’heure, sans année, mois, jour et, encore une fois, sans fuseau horaire.
Tableau comparatif des types de temps
| Type | Date | Heure | Fuseau horaire | À quoi ça sert ? |
|---|---|---|---|---|
|
✅ | ✅ | 🚫 | Presque tout (mais pas toujours pratique ou safe) |
|
✅ | ✅ | ✅ | Quand t’as besoin du moment précis ET du fuseau horaire |
|
✅ | 🚫 | 🚫 | Anniversaires, dates sans heure |
|
🚫 | ✅ | 🚫 | Heures d’ouverture, plannings, intervalles dans la journée |
2. Travailler avec DateOnly
Déclaration et création
Créer un objet DateOnly — c’est comme prendre une nouvelle habitude : simple et rapide ! Par exemple :
// Année, mois, jour
DateOnly birthday = new DateOnly(1985, 4, 20);
Tu peux utiliser DateOnly.FromDateTime si t’as déjà un objet DateTime :
DateTime now = DateTime.Now;
DateOnly today = DateOnly.FromDateTime(now);
// maintenant today contient juste la date, l’heure est jetée
Propriétés et méthodes principales
- Year, Month, Day — comme d’hab avec DateTime.
- .ToString() — formate la date, tu peux mettre ton propre format.
Console.WriteLine($"Date d’anniversaire : {birthday.Year} année, {birthday.Month} mois, {birthday.Day} jour.");
Console.WriteLine(today.ToString("dd.MM.yyyy")); // Par exemple, 30.07.2024
Arithmétique sur les dates
Tu peux facilement ajouter des jours/mois/années :
DateOnly tomorrow = today.AddDays(1);
DateOnly nextMonth = today.AddMonths(1);
Essaie dans ton appli principale de remplacer les champs de type DateTime qui stockent juste une date par DateOnly — tu seras déjà plus proche du .NET moderne !
Comparer des dates
Tu peux comparer avec <, >, == :
if (birthday < today)
Console.WriteLine("L’anniversaire est déjà passé cette année ou il y a longtemps :)");
Fini les bugs à cause des millisecondes ou minutes en trop.
Obtenir la date d’aujourd’hui
DateOnly currentDate = DateOnly.FromDateTime(DateTime.Now);
3. Travailler avec TimeOnly
Maintenant, on s’attaque à l’heure sans la date — parce que quel dev n’a jamais galéré avec les plannings de pause-déj ?
Créer un TimeOnly
TimeOnly startWork = new TimeOnly(9, 0); // 09:00
TimeOnly endWork = new TimeOnly(17, 30); // 17:30
On peut choper juste les heures, minutes, secondes :
Console.WriteLine($"Journée de taf : de {startWork.Hour}:{startWork.Minute:D2} à {endWork.Hour}:{endWork.Minute:D2}");
Obtenir l’heure depuis DateTime
DateTime now = DateTime.Now;
TimeOnly currentTime = TimeOnly.FromDateTime(now);
Console.WriteLine($"Il est {currentTime}");
Arithmétique sur l’heure
TimeOnly breakStart = startWork.AddHours(4); // pause après 4h, donc à 13:00
TimeOnly breakEnd = breakStart.AddMinutes(30); // 30 minutes de pause-déj
Comparaisons et vérifs
if (currentTime >= startWork && currentTime <= endWork)
Console.WriteLine("C’est l’heure de bosser :)");
else
Console.WriteLine("Tu peux te reposer.");
4. Interaction avec d’autres types
Conversion entre DateOnly, TimeOnly et DateTime
Parfois, tu dois récupérer un DateTime (genre pour stocker dans une vieille base ou pour la 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
Et dans l’autre sens :
DateTime dt = DateTime.Now;
DateOnly justDate = DateOnly.FromDateTime(dt);
TimeOnly justTime = TimeOnly.FromDateTime(dt);
Points importants et erreurs classiques
- Si tu essaies de parser juste une date ou juste une heure avec les vieilles méthodes genre DateTime.Parse(), tu risques d’avoir une erreur ou un résultat bizarre. Pour ça, il y a des méthodes spéciales : utilise DateOnly.Parse() et TimeOnly.Parse() — elles savent gérer les valeurs "coupées".
- Important à piger : DateOnly et TimeOnly n’ont aucune notion de fuseau horaire. C’est juste une date ou juste une heure — sans lien avec un fuseau. Si tu dois gérer les zones, stocke cette info à part.
GO TO FULL VERSION