TimeSpan到友好的字符串库(C#)

Kei*_*ams 11 c# timespan

有没有人知道用于将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.