Initialisation des systèmes...

Baptiste.Dev
Retour aux notes
LangagesIntermédiaireSérie : C# / .NET

C# : TimeSpan

Représenter une durée ou un écart : construction, le piège composantes vs totaux, opérations et formatage.

Par Baptiste Vidal
2 min de lecture
Mis à jour aujourd'hui
c#csharptimespandureetotalhoursdates

C# : TimeSpan

TimeSpan représente une durée ou un écart entre deux instants : 90 minutes, 3 jours, le temps entre deux DateTime. Ce n'est pas un point dans le temps, mais une quantité de temps.


# Construire un TimeSpan

Le plus lisible, ce sont les fabriques From... :

TimeSpan deuxHeures = TimeSpan.FromHours(2);
TimeSpan quatreVingtDix = TimeSpan.FromMinutes(90);
TimeSpan journeeEtDemie = TimeSpan.FromDays(1.5);   // les fractions sont permises

On peut aussi passer les composantes au constructeur :

TimeSpan a = new TimeSpan(1, 30, 0);       // heures, minutes, secondes -> 1h30
TimeSpan b = new TimeSpan(2, 1, 30, 0);    // jours, heures, minutes, secondes

Et un TimeSpan naît naturellement d'une soustraction de dates :

TimeSpan ecart = fin - debut;   // DateTime - DateTime donne un TimeSpan

# Composantes vs totaux : LE piège

Deux familles de propriétés, souvent confondues :

  • Composantes (Days, Hours, Minutes...) : la part de chaque unité, bornée.
  • Totaux (TotalDays, TotalHours, TotalMinutes...) : la durée entière exprimée dans cette unité, en double.
TimeSpan t = TimeSpan.FromMinutes(90);
 
t.Hours;          // 1     (la composante heures)
t.Minutes;        // 30    (la composante minutes, 0 à 59)
t.TotalHours;     // 1.5   (toute la durée en heures)
t.TotalMinutes;   // 90.0  (toute la durée en minutes)

Pour « combien d'heures en tout ? », c'est TotalHours. Utiliser Hours ici donnerait 1 au lieu de 1.5, une erreur classique.


# Les opérations

TimeSpan a = TimeSpan.FromHours(2);
TimeSpan b = TimeSpan.FromMinutes(30);
 
TimeSpan somme = a + b;          // 02:30:00
TimeSpan diff = a - b;           // 01:30:00
TimeSpan inverse = -a;           // -02:00:00 (les durées peuvent être négatives)
TimeSpan absolue = inverse.Duration();  // 02:00:00 (valeur absolue)
TimeSpan doublee = a * 2;        // 04:00:00

Combiné avec un DateTime, il décale un instant :

DateTime rappel = rendezVous - TimeSpan.FromMinutes(15);   // 15 min avant

La comparaison suit les opérateurs habituels :

if (ecart > TimeSpan.FromHours(1)) { /* plus d'une heure */ }

# Formater et parser

TimeSpan t = new TimeSpan(1, 30, 15);
 
t.ToString();                 // "01:30:15"
t.ToString(@"hh\:mm");        // "01:30" (les : sont échappés par \)
 
TimeSpan.Parse("02:15:00");   // 2h15
if (TimeSpan.TryParse(saisie, out TimeSpan resultat)) { /* ... */ }

Dans un format personnalisé, les deux-points et autres séparateurs doivent être échappés avec \, d'où le @"hh\:mm" (chaîne verbatim pour éviter la double barre).


# Les constantes utiles

TimeSpan.Zero;       // 00:00:00
TimeSpan.FromHours(0) == TimeSpan.Zero;  // true
TimeSpan.MaxValue;   // la plus grande durée représentable

TimeSpan.Zero sert de point de départ ou de comparaison (« la durée est-elle nulle ou négative ? »).


# La suite