C# : TimeSpan
Représenter une durée ou un écart : construction, le piège composantes vs totaux, opérations et formatage.
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 permisesTimeSpan deuxHeures = TimeSpan.FromHours(2);TimeSpan quatreVingtDix = TimeSpan.FromMinutes(90);TimeSpan journeeEtDemie = TimeSpan.FromDays(1.5); // les fractions sont permisesOn 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, secondesTimeSpan a = new TimeSpan(1, 30, 0); // heures, minutes, secondes -> 1h30TimeSpan b = new TimeSpan(2, 1, 30, 0); // jours, heures, minutes, secondesEt un TimeSpan naît naturellement d'une soustraction de dates :
TimeSpan ecart = fin - debut; // DateTime - DateTime donne un TimeSpanTimeSpan 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é, endouble.
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)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:00TimeSpan a = TimeSpan.FromHours(2);TimeSpan b = TimeSpan.FromMinutes(30); TimeSpan somme = a + b; // 02:30:00TimeSpan diff = a - b; // 01:30:00TimeSpan 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:00Combiné avec un DateTime, il décale un instant :
DateTime rappel = rendezVous - TimeSpan.FromMinutes(15); // 15 min avantDateTime rappel = rendezVous - TimeSpan.FromMinutes(15); // 15 min avantLa comparaison suit les opérateurs habituels :
if (ecart > TimeSpan.FromHours(1)) { /* plus d'une heure */ }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)) { /* ... */ }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"); // 2h15if (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ésentableTimeSpan.Zero; // 00:00:00TimeSpan.FromHours(0) == TimeSpan.Zero; // trueTimeSpan.MaxValue; // la plus grande durée représentableTimeSpan.Zero sert de point de départ ou de comparaison (« la durée est-elle nulle ou négative ? »).
# La suite
- Dates et temps - le hub : quel type pour quel besoin
- DateTime en profondeur - d'où viennent les écarts entre dates
- DateTimeOffset et fuseaux horaires - où l'offset est justement un
TimeSpan