2012-06-08 3 views
4

Есть ли какая-либо функциональность в .Net или любом пакете Nuget, чтобы поместить время в описательный формат того, как далеко в прошлом это было.Формат .Net datetime в описательном текстовом формате, например «Последний месяц»?

Э.Г. Учитывая дату, скажите, как это было в прошлом.

  • Вчера
  • 5 дней назад
  • Последняя неделя
  • Последний месяц
  • 4 месяца назад
  • Последний год

Я видел аналогичные вещи в Perl и я не хотят изобретать велосипед

ответ

5

Вы можете установить this NuGet пакет и у вас будет метод расширения DateTime.ToNaturalRelativeTime, который, похоже, сделает то, что вы пожелаете.

2

Там нет встроенного способа сделать это на .NET, но это просто сделать метод расширения (идея из this question, Винсент Роберт и Jeff Atwood):

public static string AsRelative(this DateTime dt) { 
    var ts = new TimeSpan(DateTime.UtcNow.Ticks - dt.Ticks); 
    double delta = Math.Abs(ts.TotalSeconds); 
    const int SECOND = 1; 
    const int MINUTE = 60 * SECOND; 
    const int HOUR = 60 * MINUTE; 
    const int DAY = 24 * HOUR; 
    const int MONTH = 30 * DAY; 

    if (delta < 0) 
    { 
     return "not yet"; 
    } 
    if (delta < 1 * MINUTE) 
    { 
     return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago"; 
    } 
    if (delta < 2 * MINUTE) 
    { 
     return "a minute ago"; 
    } 
    if (delta < 45 * MINUTE) 
    { 
     return ts.Minutes + " minutes ago"; 
    } 
    if (delta < 90 * MINUTE) 
    { 
     return "an hour ago"; 
    } 
    if (delta < 24 * HOUR) 
    { 
     return ts.Hours + " hours ago"; 
    } 
    if (delta < 48 * HOUR) 
    { 
     return "yesterday"; 
    } 
    if (delta < 30 * DAY) 
    { 
     return ts.Days + " days ago"; 
    } 
    if (delta < 12 * MONTH) 
    { 
     int months = Convert.ToInt32(Math.Floor((double)ts.Days/30)); 
     return months <= 1 ? "one month ago" : months + " months ago"; 
    } 
    else 
    { 
     int years = Convert.ToInt32(Math.Floor((double)ts.Days/365)); 
     return years <= 1 ? "one year ago" : years + " years ago"; 
    } 
} 
+0

Угадай, что я просто должен был знать, чтобы назвать это естественным временем или относительным временем, когда я искал. – GraemeMiller