2012-04-03 18 views
36

me gustaría dar formato a algunos comandos tiempos de ejecución en un formato legible por humanos, por ejemplo:Convertir milisegundos a lapso de tiempo legible por humanos

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

Teniendo en cuenta los días, horas, minutos, segundos, ...

¿Es posible usar C#?

+6

Básicamente solo tiene que usar módulo y división. –

+1

¿qué tal 'nuevo TimeSpan (30000).ToString() '? –

+0

Bueno, estoy preguntando porque tengo otras cosas que hacer aquí, en mi compañía, mejor que los ejercicios básicos de programación ;-) –

Respuesta

64

Puede utilizar la clase TimeSpan, algo como esto:

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 bastante similar a la de este hilo que acabo de descubrir:

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

+3

Esto produciría '00h: 00m: 00s: 003ms' en lugar de' 3ms' para la entrada '3', así que no creo que sea exactamente lo que quiere el OP;) – Nuffin

+3

@Nuffin, siempre puede modificar el código para se adapte a sus necesidades;) Acabo de proporcionar un ejemplo ... – walther

2

Tal vez algo como esto?

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

La pregunta es sobre 'TimeSpan's, no' DateTime's. Con un 'DateTime', siempre terminarás con al menos un día, lo que realmente no coincidiría con la entrada de 3 milisegundos. – Nuffin

15

Se podría utilizar la estática TimeSpan.FromMilliseconds método, así como el resultado TimeSpan 's Days, Hours, Minutes, Seconds y Milliseconds propiedades.

Pero estoy ocupado ahora, así que te dejaré el resto como ejercicio.

8

.NET 4 acepta el formato en TimeSpan.Tostring().

Por otra puede implementar como método de extensión

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(); 
    } 

y llame como

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

He utilizado este enfoque y solo quería señalar que el intervalo más alto (en este caso 'obj.Hours') debe ser' obj.TotalHours, ToString ("0") '. '.TotalHours' por lo que puede mostrar valores superiores a 24h, y', ToString ("0") 'para convertirlo en un solo dígito en lugar de un valor separado por comas. –

13

¿Y esto?

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

Bueno, yo normalmente odio escrito si las declaraciones, pero algunas veces más de lo que realmente tenemos es un clavo y necesito una martillo.

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

Por ejemplo, para obtener 00:01:35.0090000 como 0 horas, 1 minuto, 35 segundos y 9 milisegundos puede utilizar esto:

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

Su salida:

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

Este es un buen enfoque para periodos de tiempo más largos (para los cuales 't.TotalDays' también funciona). –

+0

Gran enfoque, y para el formateo opcional. Acción add = (val, unit, zeroplaceholder) => {if (val> 0) parts.Add (string.Format ("{0: DZ} X" .Replace ("X") , unit.ToString()) .Replace ("Z", zeroplaceholder.ToString()), val);}; y llamada con add (t.Milliseconds, "ms", 4); para obtener 2m 37s 0456ms – Markus

Cuestiones relacionadas