2012-04-03 13 views
36

Ich möchte einige Befehle Ausführungszeiten in einem für Menschen lesbaren Format formatiert werden, zum Beispiel:zu Menschen lesbaren Zeitraffer

3 -> 3ms 
1100 -> 1s 100ms 
62000 -> 1m 2s 
etc .. 

Unter Berücksichtigung Tage, Stunden, Minuten, Sekunden, ...

Ist es möglich, C# zu verwenden?

+6

Sie grundsätzlich muss nur modulo und division verwenden. –

+1

Wie wäre es mit 'neuer TimeSpan (30000).ToString() '? –

+0

Nun, ich frage, weil ich hier, in meiner Firma, andere Dinge zu tun habe, als einfache Programmierübungen ;-) –

Antwort

64

können Sie Timespan-Klasse verwenden, etwa so:

TimeSpan t = TimeSpan.FromMilliseconds(ms); 
string answer = string.Format("{0:D2}h:{1:D2}m:{2:D2}s:{3:D3}ms", 
         t.Hours, 
         t.Minutes, 
         t.Seconds, 
         t.Milliseconds); 

Es ist ganz ähnlich wie diesen Thread ich gerade gefunden habe:

What is the best way to convert seconds into (Hour:Minutes:Seconds:Milliseconds) time?

+3

Dies würde '00h: 00m: 00s: 003ms' anstelle von' 3ms' für den Eingang '3' erzeugen, also glaube ich nicht, dass es genau das ist, was das OP will;) – Nuffin

+3

@Nuffin, er kann den Code immer ändern passen Sie seine Bedürfnisse;) Ich habe nur ein Beispiel zur Verfügung gestellt ... – walther

2

Vielleicht so etwas?

DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'") 
+0

Die Frage bezieht sich auf 'TimeSpan's, nicht' DateTime's. Mit einer 'DateTime' enden Sie immer mit mindestens einem Tag, der nicht wirklich der Eingabe von 3 Millisekunden entspricht. – Nuffin

15

Sie die statische nutzen könnte TimeSpan.FromMilliseconds Methode sowie die resultierende TimeSpan 's Days, Hours, Minutes, Seconds und Milliseconds Eigenschaften.

Aber ich bin gerade beschäftigt, also überlasse ich Ihnen den Rest als Übung.

8

.NET 4 akzeptiert Format in TimeSpan.Tostring().

Für andere können Sie Erweiterungsmethode wie

public static string Format(this TimeSpan obj) 
    { 
     StringBuilder sb = new StringBuilder(); 
     if (obj.Hours != 0) 
     { 
      sb.Append(obj.Hours); 
      sb.Append(" "); 
      sb.Append("hours"); 
      sb.Append(" "); 
     } 
     if (obj.Minutes != 0 || sb.Length != 0) 
     { 
      sb.Append(obj.Minutes); 
      sb.Append(" "); 
      sb.Append("minutes"); 
      sb.Append(" "); 
     } 
     if (obj.Seconds != 0 || sb.Length != 0) 
     { 
      sb.Append(obj.Seconds); 
      sb.Append(" "); 
      sb.Append("seconds"); 
      sb.Append(" "); 
     } 
     if (obj.Milliseconds != 0 || sb.Length != 0) 
     { 
      sb.Append(obj.Milliseconds); 
      sb.Append(" "); 
      sb.Append("Milliseconds"); 
      sb.Append(" "); 
     } 
     if (sb.Length == 0) 
     { 
      sb.Append(0); 
      sb.Append(" "); 
      sb.Append("Milliseconds"); 
     } 
     return sb.ToString(); 
    } 

und rufen als

foreach (TimeSpan span in spans) 
{ 
    MessageBox.Show(string.Format("{0}", span.Format())); 
} 
+0

Ich habe diesen Ansatz verwendet und ich wollte nur darauf hinweisen, dass das höchste Intervall (in diesem Fall 'obj.Hours') sein sollte" obj.TotalHours, ToString ("0") ". '.TotalHours', so dass Werte über 24h angezeigt werden können, und', ToString ("0") ', um sie in eine einzelne Ziffer anstatt in einen kommagetrennten Wert zu konvertieren. –

13

Was dies umzusetzen?

var ts = TimeSpan.FromMilliseconds(86300000 /*whatever */); 
var parts = string 
       .Format("{0:D2}d:{1:D2}h:{2:D2}m:{3:D2}s:{4:D3}ms", 
        ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds) 
       .Split(':') 
       .SkipWhile(s => Regex.Match(s, @"00\w").Success) // skip zero-valued components 
       .ToArray(); 
var result = string.Join(" ", parts); // combine the result 

Console.WriteLine(result);   // prints '23h 58m 20s 000ms' 
0

Nun, ich hasse es normalerweise, wenn Aussagen zu schreiben aber einige Male, was Sie wirklich haben ein Nagel und brauchen ein Hammer.

string time; 
if (elapsedTime.TotalMinutes > 2) 
    time = string.Format("{0:n2} minutes", elapsedTime.TotalMinutes); 
else if (elapsedTime.TotalSeconds > 15) 
    time = string.Format("{0:n2} seconds", elapsedTime.TotalSeconds); 
else 
    time = string.Format("{0:n0}ms", elapsedTime.TotalMilliseconds); 
1

Zum Beispiel 00:01:35.0090000 als 0 Stunden zu erhalten, 1 Minute, 35 Sekunden und 9 Millisekunden können Sie verwenden:

Console.WriteLine("Time elapsed:" +TimeSpan.FromMilliseconds(numberOfMilliseconds).ToString()); 

Ihre Ausgabe:

Time elapsed: 00:01:35.0090000 
4
public static string ReadableTime(int milliseconds) 
{ 
    var parts = new List<string>(); 
    Action<int, string> add = (val, unit) => { if (val > 0) parts.Add(val+unit); }; 
    var t = TimeSpan.FromMilliseconds(milliseconds); 

    add(t.Days, "d"); 
    add(t.Hours, "h"); 
    add(t.Minutes, "m"); 
    add(t.Seconds, "s"); 
    add(t.Milliseconds, "ms"); 

    return string.Join(" ", parts); 
} 
+0

Dies ist ein schöner Ansatz für längere Zeiträume (für die auch 't.TotalDays' funktioniert). –

+0

Toller Ansatz und für optionale Formatierung. Aktion hinzufügen = (val, Einheit, zeroplaceholder) => {if (val> 0) parts.Add (string.Format ("{0: DZ} X" .Replace ("X" , unit.ToString()) .Replace ("Z", zeroplaceholder.ToString()), val);}; und mit add (t.Milliseconds, "ms", 4), um 2m 37s 0456ms zu erhalten – Markus

Verwandte Themen