我想将一些命令的执行时间格式化为人类可读的格式,例如:
3 -> 3ms 1100 -> 1s 100ms 62000 -> 1m 2s etc ..
考虑到天,小时,分钟,秒,..。
有可能使用 C#吗?
C#
也许像这样?
DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'")
可以使用 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属性。
TimeSpan.FromMilliseconds
TimeSpan
Days
Hours
Minutes
Seconds
Milliseconds
但我现在很忙,所以剩下的就交给你了。
.NET 4接受 TimeSpan.Tostring()格式。
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())); }
这个怎么样?
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'
我知道这很老套,但我想用一个很棒的金块套餐来回答。
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"
我通常不喜欢写 if 语句,但有时候你真正需要的是一个钉子和一个锤子。
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);
例如,如果想让 00:01:35.0090000为0小时、1分钟、35秒和9毫秒,可以使用以下方法:
00:01:35.0090000
Console.WriteLine("Time elapsed:" +TimeSpan.FromMilliseconds(numberOfMilliseconds).ToString());
你的输出:
Time elapsed: 00:01:35.0090000
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); }
这可能与请求的输出略有不同,但结果是人类可读的——并且可以对其进行调整以适应许多其他用例。
private static List<double> _intervals = new List<double> { 1.0 / 1000 / 1000, 1.0 / 1000, 1, 1000, 60 * 1000, 60 * 60 * 1000 }; private static List<string> _units = new List<string> { "ns", "µs", "ms", "s", "min", "h" }; public string FormatUnits(double milliseconds, string format = "#.#") { var interval = _intervals.Last(i=>i<=milliseconds); var index = _intervals.IndexOf(interval); return string.Concat((milliseconds / interval).ToString(format) , " " , _units[index]); }
举例来说。
Console.WriteLine(FormatUnits(1)); Console.WriteLine(FormatUnits(20)); Console.WriteLine(FormatUnits(300)); Console.WriteLine(FormatUnits(4000)); Console.WriteLine(FormatUnits(50000)); Console.WriteLine(FormatUnits(600000)); Console.WriteLine(FormatUnits(7000000)); Console.WriteLine(FormatUnits(80000000));
以及结果:
1000 µs 20 ms 300 ms 4 s 50 s 10 min 1.9 h 22.2 h
可以使用 TimeSpan.FromMilliseconds函数
var tspan = TimeSpan.FromMilliseconds(YOUR_MILLI_SECONDS); int h = tspan.Hours; int m = tspan.Minutes; int s = tspan.Seconds;
老问题,新答案:
public static string GetReadableTimeByMs(long ms) { TimeSpan t = TimeSpan.FromMilliseconds(ms); if (t.Hours > 0) return $"{t.Hours}h:{t.Minutes}m:{t.Seconds}s"; else if (t.Minutes > 0) return $"{t.Minutes}m:{t.Seconds}s"; else if (t.Seconds > 0) return $"{t.Seconds}s:{t.Milliseconds}ms"; else return $"{t.Milliseconds}ms"; }