是否有一种更智能的方法来生成DateTime对象的"time since"

leo*_*ora 7 c# datetime timespan

我有这段代码在过去花了一些时间并生成一个可读的字符串来表示它多久以前.

  1. 我本以为Timespan.Hours会给你几个小时,即使它过去多了一天,但它看起来像是分解成它的单独组件(天,月等).我怎么会在几小时前得到(即使它超过1天?

  2. 有没有更清晰的方法来编写这种类型的代码,因为它似乎非常spagetti-ish.

这是代码

        DateTime when = GetDateTimeinPast();
        TimeSpan ts = DateTime.Now.Subtract(when);

        switch (ts.Days)
        {
            case 0:
               if (ts.Hours < 1)
                    b.Append( ts.Minutes + " minutes ago");
               else
                   b.Append( ts.Hours + " hours ago");
                break;
            case 1:
                b.Append( " yesterday");
                break;
            case 2:
            case 3:                
            case 4:

                b.Append( "on " + when.DayOfWeek.ToString());
                break;
            default:
                b.Append(ts.Days + " days ago");
                break;
        }
Run Code Online (Sandbox Code Playgroud)

Jef*_*ado 15

使用timepan对象中的TotalHours属性或其他Total[TimeUnit]属性.

对于1:10(hh:mm)的时间跨度,它等于1 Hours和10 Minutes或1.167 TotalHours和70 TotalMinutes.

至于清理它,坚持使用if/else分支,如前所述.开关/外壳无法帮助您满足这些条件,仅适用于特定值.像这样的东西:

DateTime when = GetDateTimeinPast();
TimeSpan ts = DateTime.Now.Subtract(when);
if (ts.TotalHours < 1)
    b.AppendFormat("{0} minutes ago", (int)ts.TotalMinutes);
else if (ts.TotalDays < 1)
    b.AppendFormat("{0} hours ago", (int)ts.TotalHours);
//etc...
Run Code Online (Sandbox Code Playgroud)