Utilisez String.Format sur un TimeSpan à quelques secondes sans millisecondes pleine sortie
-
30-09-2019 - |
Question
Je veux afficher le temps écoulé entre deux dates dans une chaîne.
Le mot Let je le code suivant:
DateTime date1 = DateTime.Now();
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now();
TimeSpan elapsed = date2.substract(date1);
Console.WriteLine("> {0:hh:mm:ss}", elapsed);
Ce que je pense:
> 00:00:03
Qu'est-ce que je reçois:
> 00:00:02.5002500
Est-il possible d'utiliser la fonction String.Format pour revenir que quelques secondes pleines
J'ai aussi essayé d'enlever les décimales avec:
elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);
Mais cela ne fonctionne pas non plus depuis elapsed.Miliseconds 500 retours sous forme d'entier.
La solution
Modifier la balise
Console.WriteLine("> {0:hh:mm:ss}", elapsed);
à
Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed);
.Net 4 vous permet d'utiliser des chaînes de format personnalisé avec Timespan. Vous pouvez trouver une référence complète des paramètres de format disponibles au MSDN personnalisée TimeSpan Format Strings page.
Vous devez échapper à la « : ». Caractère avec un « \ » (qui lui-même doit être échappèrent à moins que vous utilisez une chaîne verbatim)
Cet extrait du MSDN personnalisée TimeSpan chaînes de format explique à propos de échapper à la « : » et « » caractères dans une chaîne de format:
Le format TimeSpan personnalisés spécificateurs ne comprennent pas les symboles de séparation espace réservé, comme les symboles que les jours séparés de plusieurs heures, heures de minutes ou secondes de fractions de seconde. Au lieu de cela, ces symboles doivent être inclus dans la chaîne de format personnalisé comme des chaînes. Par exemple, « jj.hh: mm » définit un point comme séparateur entre les jours et heures de travail, et deux points (:) comme séparateur entre les heures et les minutes
(.).
Autres conseils
Malheureusement, il est impossible de formater un TimeSpan
de la même manière en tant que valeur de DateTime
. Vous pouvez cependant faire une conversion rapide parce que les deux TimeSpan et DateTime conservent leur valeur comme les tiques (dans la propriété Ticks
).
Dans votre code qui ressemblerait à ceci:
Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));
Mise à jour: Ceci est valable pour .NET 3.5 et versions antérieures, .NET 4 pris en charge par le formatage plages temporelles
. La classe TimeSpan
a des propriétés Hours
, Minutes
et Seconds
qui reviennent chaque partie de temps individuellement. Donc, vous pouvez essayer:
String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}",
elapsed.Hours,
elapsed.Minutes,
elapsed.Seconds)
Pour obtenir le format souhaité.
Il peut y avoir une façon plus optimale, mais je n'ai pas encore trouvé.
Après avoir regardé quelques façons de le faire, je suis malheureusement laissé une réponse laid. Vous ne pouvez pas vraiment utiliser Tiques, car il ne retourne pas le format correctement, mais cela devrait fonctionner:
DateTime date1 = DateTime.Now;
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now;
TimeSpan elapsed = date2.Subtract(date1);
string[] Split = elapsed.ToString().Split('.');
string m = Split[0]; // Returns 00:00:02
Hmm, c'est méchant (comme il se avère) - au moins avant .NET 4.0
Si vous allez ici: http: / /msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx il vous dira qu'il n'y a pas de surcharge de format pour un laps de temps et que vous devez le faire à la main, par exemple :
span.Hours.ToString("00") + ":" +
span.Minutes.ToString("00") + ":" +
span.Seconds.ToString("00") + "."
Cela semble - au moins de la documentation - à fixer dans .NET 4.0
vous pouvez faire ceci:
dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();
Il y a format suivant personnalisé spécificateurs y (année), M (mois), d (jour), h (heure 12), H (heure 24), m (minute), s (seconde), f (deuxième fraction ), F (seconde fraction, zéros sont garnis), t (PM ou AM) et z (fuseau horaire).
exemples suivants montrent comment sont les spécificateurs réécrites à la sortie. [C #]
// create date time 2008-03-09 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}", dt); // "4 04 16 16" hour 12/24
String.Format("{0:m mm}", dt); // "5 05" minute
String.Format("{0:s ss}", dt); // "7 07" second
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes
String.Format("{0:t tt}", dt); // "P PM" A.M. or P.M.
String.Format("{0:z zz zzz}", dt); // "-6 -06 -06:00" time zone