Utilisez String.Format sur un TimeSpan à quelques secondes sans millisecondes pleine sortie

StackOverflow https://stackoverflow.com/questions/3545508

  •  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.

Était-ce utile?

La solution

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top