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 |
|---|---|
|
Nombre entier de jours |
|
Partie heures |
|
Partie minutes |
|
Partie secondes |
|
Temps en jours (fractionnaire) |
|
Temps en heures (fractionnaire) |
|
Temps en minutes (fractionnaire) |
|
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) |
|---|---|
|
Jours (supporte les fractions, genre 1,5 jour) |
|
Mois (prend en compte la longueur du mois automatiquement) |
|
Années (même les bissextiles) |
|
Heures |
|
Minutes |
|
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 | |
|
| Ajouter 2 semaines à une date | |
|
| Calculer l'âge | Formule avec et vérif mois/jour |
Voir la section plus haut |
| Obtenir/mettre juste la date | |
|
| Obtenir/mettre juste l'heure | |
|
| Comparer des dates | Opérateurs , , , |
|
| Changer de fuseau horaire | |
|
| Connaître le numéro de la semaine dans l'année | |
voir la doc |
| Connaître le jour de la semaine | |
|
| Compter les jours ouvrés | Boucle avec vérif |
Voir la section plus haut |
GO TO FULL VERSION