CodeGym /Cours /C# SELF /Types pratiques : DateOnly et TimeOnly

Types pratiques : DateOnly et TimeOnly

C# SELF
Niveau 15, Leçon 1
Disponible

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 ?
DateTime
✅ ✅ 🚫 Presque tout (mais pas toujours pratique ou safe)
DateTimeOffset
✅ ✅ ✅ Quand t’as besoin du moment précis ET du fuseau horaire
DateOnly
✅ 🚫 🚫 Anniversaires, dates sans heure
TimeOnly
🚫 ✅ 🚫 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);
Création d’une date d’anniversaire avec DateOnly

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.
2
Mission
C# SELF, niveau 15, leçon 1
Bloqué
Travail avec `DateOnly`
Travail avec `DateOnly`
2
Mission
C# SELF, niveau 15, leçon 1
Bloqué
Travailler avec `TimeOnly`
Travailler avec `TimeOnly`
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION