有没有人知道用于将TimeSpan对象转换为"友好"字符串的好库(或代码片段),例如:
(这是一个文件到期系统,到期时间可能是几天到几十年)
只是为了澄清,说我有7天的TimeSpan,应打印"1周",14天"2周",366天"1年1天"等.
Ger*_*old 16
我偶然发现了这个问题,因为我想做类似的事情.经过一些谷歌搜索后,我仍然没有找到我想要的东西:以某种"圆润"的方式显示时间跨度.我的意思是:当某个事件需要几天时,显示毫秒并不总是有意义的.然而,当它需要几分钟时,它可能会.在这种情况下,我不希望显示0天0小时.所以,我想参数化要显示的相关时间跨度部分的数量.这导致了这段代码:
public static class TimeSpanExtensions
{
private enum TimeSpanElement
{
Millisecond,
Second,
Minute,
Hour,
Day
}
public static string ToFriendlyDisplay(this TimeSpan timeSpan, int maxNrOfElements)
{
maxNrOfElements = Math.Max(Math.Min(maxNrOfElements, 5), 1);
var parts = new[]
{
Tuple.Create(TimeSpanElement.Day, timeSpan.Days),
Tuple.Create(TimeSpanElement.Hour, timeSpan.Hours),
Tuple.Create(TimeSpanElement.Minute, timeSpan.Minutes),
Tuple.Create(TimeSpanElement.Second, timeSpan.Seconds),
Tuple.Create(TimeSpanElement.Millisecond, timeSpan.Milliseconds)
}
.SkipWhile(i => i.Item2 <= 0)
.Take(maxNrOfElements);
return string.Join(", ", parts.Select(p => string.Format("{0} {1}{2}", p.Item2, p.Item1, p.Item2 > 1 ? "s" : string.Empty)));
}
}
Run Code Online (Sandbox Code Playgroud)
示例(LinqPad):
new TimeSpan(1,2,3,4,5).ToFriendlyDisplay(3).Dump();
new TimeSpan(0,5,3,4,5).ToFriendlyDisplay(3).Dump();
Run Code Online (Sandbox Code Playgroud)
显示:
1 Day, 2 Hours, 3 Minutes
5 Hours, 3 Minutes, 4 Seconds
Run Code Online (Sandbox Code Playgroud)
适合我,看看它是否适合你.
And*_*hop 14
不是一个功能齐全的实现,但它应该让你足够接近.
DateTime dtNow = DateTime.Now;
DateTime dtYesterday = DateTime.Now.AddDays(-435.0);
TimeSpan ts = dtNow.Subtract(dtYesterday);
int years = ts.Days / 365; //no leap year accounting
int months = (ts.Days % 365) / 30; //naive guess at month size
int weeks = ((ts.Days % 365) % 30) / 7;
int days = (((ts.Days % 365) % 30) % 7);
StringBuilder sb = new StringBuilder();
if(years > 0)
{
sb.Append(years.ToString() + " years, ");
}
if(months > 0)
{
sb.Append(months.ToString() + " months, ");
}
if(weeks > 0)
{
sb.Append(weeks.ToString() + " weeks, ");
}
if(days > 0)
{
sb.Append(days.ToString() + " days.");
}
string FormattedTimeSpan = sb.ToString();
Run Code Online (Sandbox Code Playgroud)
最后,你真的需要让某人知道一份文件将在1年零5个月,2周和3天后到期吗?你不能告诉他们文件将在1年后过期,或者从现在起5个月后过期吗?只需占用最大的单位并说出该单位的n.