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

Dan*_*lba 53 .net c# format timespan

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

3 -> 3ms
1100 -> 1s 100ms
62000 -> 1m 2s
etc ..
Run Code Online (Sandbox Code Playgroud)

考虑到天,小时,分钟,秒......

有可能用C#吗?

wal*_*her 93

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

它与我刚发现的这个帖子非常相似:

将秒转换为(小时:分钟:秒:毫秒)时间的最佳方法是什么?

  • 对于输入"3",这将产生"00h:00m:00s:003ms"而不是"3ms",因此我认为这不是OP想要的;) (6认同)
  • @Nuffin,他总是可以改变代码以满足他的需要;)我刚刚提供了一个例子...... (5认同)

小智 21

我知道这已经过时了,但我想用一个很棒的nuget包来回答.

Install-Package Humanizer
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)


Nuf*_*fin 14

你可以使用静态TimeSpan.FromMilliseconds方法,以及由此产生TimeSpanDays,Hours,Minutes,SecondsMilliseconds属性.

但我现在很忙,所以我会把剩下的留给你作为练习.


Igo*_*hov 14

那这个呢?

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'
Run Code Online (Sandbox Code Playgroud)


hun*_*ind 9

.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();
    }
Run Code Online (Sandbox Code Playgroud)

并打电话给

foreach (TimeSpan span in spans)
{
    MessageBox.Show(string.Format("{0}",  span.Format()));
}
Run Code Online (Sandbox Code Playgroud)


Sti*_*tix 6

老问题,新答案:

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";
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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);
}
Run Code Online (Sandbox Code Playgroud)