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

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

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

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

有可能使用 C#吗?

66357 次浏览

也许像这样?

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方法以及得到的 TimeSpanDaysHoursMinutesSecondsMilliseconds属性。

但我现在很忙,所以剩下的就交给你了。

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

这个怎么样?

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毫秒,可以使用以下方法:

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";
}