2012-04-03 73 views
36

我想格式化一些命令執行時間在人類可讀的格式,例如:轉換毫秒到人類可讀的時間流逝

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

考慮到天,小時,分,秒,...

是否有可能使用C#

+6

基本上你只需要使用模和劃分。 – 2012-04-03 13:07:19

+1

'新TimeSpan(30000)如何?的ToString()'? – 2012-04-03 13:09:02

+0

嗯,我問,因爲我在這裏有其他的事情,在我的公司,比基本的編程練習更好;-) – 2012-04-03 13:09:46

回答

64

您可以使用時間跨度類,像這樣:

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); 

這是因爲這個線程我只是發現頗爲相似:

What is the best way to convert seconds into (Hour:Minutes:Seconds:Milliseconds) time?

+3

這將產生'00h:00m:00s:003ms'而不是'3ms',用於輸入'3',所以我不認爲這正是OP想要的; – Nuffin 2012-04-03 13:17:11

+3

@Nuffin,他總是可以將代碼更改爲滿足他的需求;)我剛剛提供了一個例子... – walther 2012-04-03 13:20:12

2

也許這樣?

DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'") 
+0

問題是關於'TimeSpan's,而不是'DateTime's。使用'DateTime',你至少會有一天的時間結束,這與3毫秒的輸入不匹配。 – Nuffin 2012-04-03 13:18:49

15

你可以利用靜態TimeSpan.FromMilliseconds方法以及由此產生的TimeSpanDays,Hours,MinutesSecondsMilliseconds屬性。

但是我現在很忙,所以我會把剩下的作爲練習留給你。

8

.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())); 
} 
+0

我已經使用了這種方法,我只是想指出最高區間(在本例中爲'obj.Hours')應該是'obj.TotalHours,ToString ( 「0」)'。 '.TotalHours'可以顯示24小時以上的值,而'ToString(「0」)'可以將它轉換爲一個數字而不是逗號分隔值。 – 2016-08-04 14:31:23

13

這個怎麼樣?

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' 
15

我知道這是舊的,但我想用一個偉大的nuget包來回答。從他們的readme.md

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

這就是我一直在尋找的! – Shimmy 2017-04-19 02:27:21

0

嗯,我常恨寫if語句但有些時候你真的是一個釘子,需要一個

Install-Package Humanizer 

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

https://github.com/MehdiK/Humanizer

例錘子。

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); 
1

例如獲得00:01:35.0090000 0小時,1分35秒,9毫秒就可以使用這樣的:

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

你的輸出:

Time elapsed: 00:01:35.0090000 
4
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); 
} 
+0

這是一個不錯的方法,適用於更長的時間跨度(也適用於't.TotalDays')。 – 2016-10-19 23:15:09

+0

偉大的方法,和可選的格式。 Action add =(val,unit,zeroplaceholder)=> {if(val> 0)parts.Add(string.Format(「{0:DZ} X」.Replace(「X」 (t.Milliseconds,「ms」,4);獲得2m 37s 0456ms, – Markus 2017-09-26 14:50:16