将毫秒转换为人类可读的时间间隔

我想用人们可读的格式格式化一些命令执行时间,例如:

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方法以及由此产生的TimeSpanDaysHoursMinutesSecondsMilliseconds属性。

但是我现在很忙,所以我会把剩下的给你做个练习。

我知道这是旧的,但我想用一个伟大的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);