Convertir des millisecondes en un laps de temps lisible par l’homme

J’aimerais mettre en forme des temps d’exécution de commandes dans un format lisible, par exemple:

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

Prise en compte des jours, heures, minutes, secondes, …

Est-ce possible en utilisant C# ?

Vous pouvez utiliser la classe TimeSpan, quelque chose comme ceci:

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

C’est assez similaire à ce fil que je viens de trouver:

Quelle est la meilleure façon de convertir les secondes en temps (heure: minutes: secondes: millisecondes)?

Je sais que c’est vieux, mais je voulais répondre avec un grand paquet de nuget.

 Install-Package Humanizer 

https://www.nuget.org/packages/Humanizer

https://github.com/MehdiK/Humanizer

Exemple de leur readme.md

 TimeSpan.FromMilliseconds(1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds" 

Vous pouvez utiliser la méthode statique TimeSpan.FromMilliseconds ainsi que les TimeSpan Days , Hours , Minutes , Seconds et Milliseconds .

Mais je suis occupé en ce moment, alors je vais vous laisser le rest comme un exercice.

Et ça?

 var ts = TimeSpan.FromMilliseconds(86300000 /*whatever */); var parts = ssortingng .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 = ssortingng.Join(" ", parts); // combine the result Console.WriteLine(result); // prints '23h 58m 20s 000ms' 

.NET 4 accepte le format dans TimeSpan.Tossortingng() .

Pour d’autres, vous pouvez implémenter une méthode d’extension comme

  public static ssortingng Format(this TimeSpan obj) { SsortingngBuilder sb = new SsortingngBuilder(); 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.ToSsortingng(); } 

et appeler comme

 foreach (TimeSpan span in spans) { MessageBox.Show(ssortingng.Format("{0}", span.Format())); } 
 public static ssortingng ReadableTime(int milliseconds) { var parts = new List(); Action 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 ssortingng.Join(" ", parts); } 

Peut-être quelque chose comme ça?

 DateTime.Now.ToSsortingng("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'") 

Par exemple, pour obtenir 00:01:35.0090000 comme 0 heure, 1 minute, 35 secondes et 9 millisecondes, vous pouvez utiliser ceci:

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

Votre sortie:

 Time elapsed: 00:01:35.0090000 

Eh bien, je déteste normalement écrire si les déclarations, mais parfois ce que vous avez vraiment est un clou et besoin d’un marteau.

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