c# - militar - Convertir milisegundos a tiempo legible por humanos
milisegundos c# (9)
.NET 4 acepta el formato en TimeSpan.Tostring()
.
Para otros puedes implementar el método de extensión como
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 llamar como
foreach (TimeSpan span in spans)
{
MessageBox.Show(string.Format("{0}", span.Format()));
}
Me gustaría formatear algunos tiempos de ejecución de comandos en un formato legible por humanos, por ejemplo:
3 -> 3ms
1100 -> 1s 100ms
62000 -> 1m 2s
etc ..
Teniendo en cuenta días, horas, minutos, segundos, ...
¿Es posible usar C#
?
Bueno, normalmente odio escribir declaraciones, pero algunas veces lo que realmente tienes es un clavo y necesito un 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);
Por ejemplo, para obtener 00:01:35.0090000
como 0 horas, 1 minuto, 35 segundos y 9 milisegundos, puede usar esto:
Console.WriteLine("Time elapsed:" +TimeSpan.FromMilliseconds(numberOfMilliseconds).ToString());
Su salida:
Time elapsed: 00:01:35.0090000
Puede utilizar el método estático TimeSpan.FromMilliseconds
, así como las propiedades resultantes de los Days
, Hours
, Minutes
, Seconds
y Milliseconds
TimeSpan
.
Pero ahora mismo estoy ocupado, así que te dejaré el resto como ejercicio.
Puedes usar 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 este hilo que acabo de encontrar:
¿Cuál es la mejor manera de convertir segundos en tiempo (Hora: Minutos: Segundos: Milisegundos)?
Que hay de 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''
Sé que esto es viejo, pero quería responder con un gran paquete nuget.
Install-Package Humanizer
https://www.nuget.org/packages/Humanizer
https://github.com/MehdiK/Humanizer
Ejemplo de su readme.md
TimeSpan.FromMilliseconds(1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds"
Tal vez algo como esto?
DateTime.Now.ToString("%d ''d'' %h ''h'' %m ''m'' %s ''seconds'' %ms ''ms''")
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);
}