我想格式化一些命令执行时间在人类可读的格式,例如:转换毫秒到人类可读的时间流逝
3 -> 3ms
1100 -> 1s 100ms
62000 -> 1m 2s
etc ..
考虑到天,小时,分,秒,...
是否有可能使用C#
?
我想格式化一些命令执行时间在人类可读的格式,例如:转换毫秒到人类可读的时间流逝
3 -> 3ms
1100 -> 1s 100ms
62000 -> 1m 2s
etc ..
考虑到天,小时,分,秒,...
是否有可能使用C#
?
您可以使用时间跨度类,像这样:
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?
也许这样?
DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'")
问题是关于'TimeSpan's,而不是'DateTime's。使用'DateTime',你至少会有一天的时间结束,这与3毫秒的输入不匹配。 – Nuffin 2012-04-03 13:18:49
你可以利用静态TimeSpan.FromMilliseconds
方法以及由此产生的TimeSpan
的Days
,Hours
,Minutes
,Seconds
和Milliseconds
属性。
但是我现在很忙,所以我会把剩下的作为练习留给你。
.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()));
}
我已经使用了这种方法,我只是想指出最高区间(在本例中为'obj.Hours')应该是'obj.TotalHours,ToString ( “0”)'。 '.TotalHours'可以显示24小时以上的值,而'ToString(“0”)'可以将它转换为一个数字而不是逗号分隔值。 – 2016-08-04 14:31:23
这个怎么样?
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'
我知道这是旧的,但我想用一个伟大的nuget包来回答。从他们的readme.md
TimeSpan.FromMilliseconds(1299630020).Humanize(4) => "2 weeks, 1 day, 1 hour, 30 seconds"
这就是我一直在寻找的! – Shimmy 2017-04-19 02:27:21
嗯,我常恨写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);
例如获得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);
}
这是一个不错的方法,适用于更长的时间跨度(也适用于't.TotalDays')。 – 2016-10-19 23:15:09
伟大的方法,和可选的格式。 Action
基本上你只需要使用模和划分。 – 2012-04-03 13:07:19
'新TimeSpan(30000)如何?的ToString()'? – 2012-04-03 13:09:02
嗯,我问,因为我在这里有其他的事情,在我的公司,比基本的编程练习更好;-) – 2012-04-03 13:09:46