将毫秒转换为人类可读的时间间隔
我想用人们可读的格式格式化一些命令执行时间,例如:
3 -> 3ms 1100 -> 1s 100ms 62000 -> 1m 2s etc ..
考虑到天,小时,分钟,秒,…
是否有可能使用C#
?
您可以使用TimeSpan类,如下所示:
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);
和我刚刚发现的这个线程非常相似:
将秒转换为(小时:分钟:秒:毫秒)的最佳方法是什么?
您可以利用静态TimeSpan.FromMilliseconds
方法以及由此产生的TimeSpan
的Days
, Hours
, Minutes
, Seconds
和Milliseconds
属性。
但是我现在很忙,所以我会把剩下的给你做个练习。
我知道这是旧的,但我想用一个伟大的nuget包来回答。
Install-Package Humanizer
https://www.nuget.org/packages/Humanizer
https://github.com/MehdiK/Humanizer
来自他们的readme.md的例子
TimeSpan.FromMilliseconds(1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds"
那这个呢?
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'
.NET 4接受TimeSpan.Tostring()
格式。
对于其他你可以实现类似的扩展方法
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(); }
并称之为
foreach (TimeSpan span in spans) { MessageBox.Show(string.Format("{0}", span.Format())); }
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); }
也许这样?
DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'")
例如,要获得00:01:35.0090000
0小时1分35秒9毫秒,可以使用这个:
Console.WriteLine("Time elapsed:" +TimeSpan.FromMilliseconds(numberOfMilliseconds).ToString());
你的输出:
Time elapsed: 00:01:35.0090000
那么我通常讨厌写作如果陈述,但有些时候你真的有一个钉子,需要一把锤子。
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);