CodeGym /Cours /C# SELF /Calculs et classes utilitaires pour les dates et l'heure

Calculs et classes utilitaires pour les dates et l'heure

C# SELF
Niveau 15 , Leçon 4
Disponible

1. Les tâches principales quand tu bosses avec les dates et l'heure

Travailler avec les dates et l'heure, ça peut vite filer un petit (ou parfois gros) coup de panique, même chez les devs expérimentés. Tu vas devoir comparer des dates, calculer des intervalles, ajouter ou soustraire des jours/mois/années, calculer un âge, trouver le jour de la semaine et plein d'autres trucs.

Tout ça, c'est du classique pour les gestionnaires de tâches et les calendriers, la gestion d'abonnements, les calculs financiers, les rapports de stats, et bien sûr pour les questions d'entretien (genre "calcule le nombre de jours ouvrés entre deux dates").

En C# et .NET, t'as des classes et méthodes intégrées pour tout ça. Et surtout — la plupart des calculs se font via une API orientée objet, super safe et claire.

2. La structure TimeSpan — mesurer des intervalles de temps

Tout commence avec la structure TimeSpan. C'est un "morceau" de temps : genre 5 jours, 3 heures, 7 minutes et 21 secondes.

Comment créer un TimeSpan ?

Tu peux "soustraire" deux dates, ou créer explicitement :

// La différence entre deux dates, c'est toujours un TimeSpan !
DateTime start = new DateTime(2025, 5, 1, 7, 0, 0);
DateTime end = new DateTime(2025, 5, 2, 11, 30, 0);

TimeSpan duration = end - start; // Magie pure !
Console.WriteLine(duration); // 1.04:30:00 (1 jour, 4 heures, 30 minutes)

Tu peux aussi créer un TimeSpan explicitement via les paramètres du constructeur :

TimeSpan span = new TimeSpan(2, 14, 18, 0); // 2 jours, 14 heures, 18 minutes, 0 secondes
Console.WriteLine(span); // 2.14:18:00

Autre façon de créer — via les méthodes statiques, souvent plus lisibles :

TimeSpan fiveMinutes = TimeSpan.FromMinutes(5);
TimeSpan twoHours = TimeSpan.FromHours(2);
TimeSpan oneWeek = TimeSpan.FromDays(7);

Quelles propriétés a TimeSpan ?

Propriété Description
Days
Nombre entier de jours
Hours
Partie heures
Minutes
Partie minutes
Seconds
Partie secondes
TotalDays
Temps en jours (fractionnaire)
TotalHours
Temps en heures (fractionnaire)
TotalMinutes
Temps en minutes (fractionnaire)
TotalSeconds
Temps en secondes (fractionnaire)
Console.WriteLine($"Jours : {duration.Days}, Total heures : {duration.TotalHours}");

Comment ajouter/soustraire un TimeSpan à une date ?

DateTime now = DateTime.Now;
DateTime future = now.Add(duration); // On ajoute duration à now
DateTime past = now.Subtract(TimeSpan.FromDays(10)); // Moins 10 jours

Console.WriteLine(future);
Console.WriteLine(past);

3. Calculatrice de dates : calculer la différence entre deux dates

Une compétence qui sert tout le temps. Genre, quelqu'un veut savoir combien de temps il reste avant les vacances, un autre — quand finit la période gratuite.

DateTime today = DateTime.Today;
DateTime vacation = new DateTime(2025, 8, 1);
TimeSpan untilVacation = vacation - today;

Console.WriteLine($"Il reste {untilVacation.Days} jours avant les vacances !");

Fais gaffe : si tu soustrais juste des "dates" sans heure (DateTime.Date ou DateTime.Today), le résultat c'est toujours un nombre entier de jours. Mais si au moins une date a une heure, la différence sera fractionnaire.


int days = (vacation - today).TotalDays; // Erreur de compilation ! TotalDays — double

Si tu veux un entier — utilise .Days ou cast en int via (int)TotalDays.

4. Ajouter et soustraire du temps : méthodes AddDays, AddMonths, AddHours, ...

C# ne te demande pas de compter à la main les jours de chaque mois, les années bissextiles et tout le bazar. Utilise juste :

DateTime orderDate = new DateTime(2024, 4, 20);
DateTime deliveryDate = orderDate.AddDays(14); // Dans 2 semaines

Console.WriteLine($"Le produit sera livré le {deliveryDate.ToShortDateString()}");
Méthode Ce que ça ajoute (ou soustrait si négatif)
AddDays(double)
Jours (supporte les fractions, genre 1,5 jour)
AddMonths(int)
Mois (prend en compte la longueur du mois automatiquement)
AddYears(int)
Années (même les bissextiles)
AddHours(double)
Heures
AddMinutes(double)
Minutes
AddSeconds(double)
Secondes
DateTime birthday = new DateTime(2000, 2, 29);
DateTime nextYear = birthday.AddYears(1); // 2001-02-28 (pas le 29, car 2001 n'est pas bissextile)
Console.WriteLine(nextYear.ToShortDateString()); // 28.02.2001

N'oublie pas : toutes les méthodes renvoient une nouvelle instance de date, la date d'origine ne change pas !

var dt = DateTime.Now;
dt.AddDays(5); // Ça NE change PAS dt !
dt = dt.AddDays(5); // Là, ça change

5. Méthodes utilitaires pour les calculs

Calcul du jour de la semaine

La plupart du temps, tu peux utiliser la propriété .DayOfWeek :

DateTime examDate = new DateTime(2025, 6, 19);
DayOfWeek day = examDate.DayOfWeek;
Console.WriteLine(day); // Wednesday

Tu peux le convertir en entier :

int number = (int)day; // Sunday == 0, Monday == 1, etc.

Vérifier "aujourd'hui", "hier", "demain"

Comparaisons toutes simples :

DateTime date = new DateTime(2025, 6, 18);

if (date.Date == DateTime.Today)
    Console.WriteLine("Aujourd'hui !");
else if (date.Date == DateTime.Today.AddDays(-1))
    Console.WriteLine("Hier !");
else if (date.Date == DateTime.Today.AddDays(1))
    Console.WriteLine("Demain !");

Calculer l'âge

Une des tâches les plus courantes — calculer correctement l'âge d'une personne. Juste soustraire les années, ça marche pas toujours :

public static int CalculateAge(DateTime birthDate, DateTime currentDate)
{
    int age = currentDate.Year - birthDate.Year;
    
    // Si l'anniversaire n'est pas encore passé cette année
    if (currentDate.Month < birthDate.Month || 
        (currentDate.Month == birthDate.Month && currentDate.Day < birthDate.Day))
    {
        age--;
    }
    
    return age;
}

// Utilisation
DateTime birth = new DateTime(1990, 8, 15);
DateTime today = DateTime.Today;
int age = CalculateAge(birth, today);
Console.WriteLine($"Âge : {age} ans");

Travailler avec les jours ouvrés

Souvent, il faut calculer le nombre de jours ouvrés entre deux dates, en excluant les week-ends :

public static int CountWorkingDays(DateTime startDate, DateTime endDate)
{
    int workingDays = 0;
    DateTime current = startDate;
    
    while (current <= endDate)
    {
        if (current.DayOfWeek != DayOfWeek.Saturday && 
            current.DayOfWeek != DayOfWeek.Sunday)
        {
            workingDays++;
        }
        current = current.AddDays(1);
    }
    
    return workingDays;
}

6. Comment les classes principales sont liées

graph TD
    A(DateTime) --soustraction--> B(TimeSpan)
    A2(DateTime) --AddDays, AddMonths--> A
    A --ToLocalTime/ToUniversalTime--> C(DateTimeOffset)
    D(DateOnly) --ToDateTime--> A
    E(TimeOnly) --ToTimeSpan--> B
    A --DayOfWeek, Day, Month, Year--> F(Propriétés numériques)
    B(TimeSpan) --TotalDays, TotalHours, ...--> G(Propriétés de durée)

7. Mémo rapide : que faire si...

Tâche Quoi utiliser Exemple
Connaître la différence entre deux dates
TimeSpan duration = d2 - d1
(d2 - d1).Days
Ajouter 2 semaines à une date
date.AddDays(14)
date.AddDays(14)
Calculer l'âge Formule avec
.Year
et vérif mois/jour
Voir la section plus haut
Obtenir/mettre juste la date
DateOnly
DateOnly.FromDateTime(DateTime.Now)
Obtenir/mettre juste l'heure
TimeOnly
TimeOnly.FromDateTime(DateTime.Now)
Comparer des dates Opérateurs
<
,
>
,
==
,
.CompareTo()
if (d1 < d2) ...
Changer de fuseau horaire
DateTimeOffset + ToOffset
dto.ToOffset(TimeSpan.FromHours(3))
Connaître le numéro de la semaine dans l'année
Calendar.GetWeekOfYear()
voir la doc
Connaître le jour de la semaine
date.DayOfWeek
Compter les jours ouvrés Boucle avec vérif
DayOfWeek
Voir la section plus haut
1
Étude/Quiz
Travailler avec les dates, niveau 15, leçon 4
Indisponible
Travailler avec les dates
Travailler avec les dates, l'heure et les fuseaux horaires
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION