2013-06-08 2 views
0

У меня есть класс DateConverter, который делает все основы. Однако я хочу добавить к нему еще один тип. Я хочу иметь тип «Описательный», который возвращает разницу между датой и DateTime.Now, отформатированной как строка.Как создать дескриптор DateConverter в C#?

И.Е.: "секунд назад", "7 минут назад", "8 часов назад"

Какой бы больший инкремент.

Я полагаю, что единственное, чего мне не хватает, - это выяснить, как получить разницу между двумя датами в секундах. C# все еще немного для меня.

+0

Вы можете просто следовать следующим образом: http://stackoverflow.com/questions/11/how-do-calculate-relative-time – Lenin

+1

Спасибо, Ленин, в сочетании с ответами и вашей ссылкой, я смог завершить конвертер, который я пытался сделать! –

+0

Возможный дубликат [TimeSpan для дружественной библиотеки строк (C#)] (http://stackoverflow.com/questions/1138723/timespan-to-friendly-string-library-c) –

ответ

1

вы можете вычесть два объекта даты-времени, и он будет возвращать TimeSpan и вы можете получить Seconds свойство TimeSpan

var timespan = (datetime1 - datetime2); 
var seconds = timespan.Seconds; 
var Minutes = timespan.Minutes; 
var hours = timespan.Hours; 

Я полагаю, что единственное, что я отсутствующий является выяснение того, как получить разницу между двумя датами в секундах.

, то вы хотите timespan.TotalSeconds

0

что об использовании метода расширения вместо этого, как

public static string FromNowFormatted(this DateTime date) 
{ 
    var sb = new StringBuilder(); 

    var t = DateTime.Now - date; 

    var dic = new Dictionary<string, int> 
       { 
        {"years", (int)(t.Days/365)}, 
        {"months", (int)(t.Days/12)}, 
        {"days", t.Days}, 
        {"hours", t.Hours}, 
        {"minutes", t.Minutes}, 
        {"seconds", t.Seconds}, 
       }; 

    bool b = false; 
    foreach (var e in dic) 
    {     
     if (e.Value > 0 || b) 
     { 
      var v = e.Value; 
      var k = v == 1 ? e.Key.TrimEnd('s') : e.Key ; 

      sb.Append(v + " " + k + "\n"); 
      b = true; 
     } 
    } 

    return sb.ToString(); 
} 

demo

Примечание: Есть некоторые вещи, с этим кодом вам нужно исправить - так, как рассчитываются годы и месяцы.

Редактировать: вы можете использовать период Noda Time.Between(), который вычисляет разницу, а затем просто имеет метод расширения, как указано выше, который просто форматирует его аналогичным образом. см. раздел «Поиск периода между двумя значениями» here для получения дополнительной информации.