Как создать описательный DateConverter на C #?

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

IE: «секунды назад», «7 минут назад», «8 часов назад»

Какое бы приращение ни было больше.

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


person Pratt Hinds    schedule 08.06.2013    source источник
comment
Вы можете просто следовать этому: stackoverflow.com/ questions / 11 / how-do-i-calculate-relative-time   -  person Lenin    schedule 08.06.2013
comment
Спасибо Ленину, вместе с ответами и вашей ссылкой, я смог завершить конвертер, который я пытался сделать!   -  person Pratt Hinds    schedule 09.06.2013
comment
возможный дубликат TimeSpan для дружественной строковой библиотеки (C #)   -  person Suresh Atta    schedule 09.06.2013


Ответы (2)


вы можете вычесть два объекта datetime, и он вернет _1 _ , и вы можете получить _2 _ свойство TimeSpan

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

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

тогда ты хочешь timespan.TotalSeconds

person Damith    schedule 08.06.2013

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

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();
}

демонстрация

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

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

person T I    schedule 08.06.2013