Формат TimeSpan "красивое время" в С#

Ввод в заголовок этого вопроса привел меня к этому вопросу. Я ищу то же самое, но что-то, возможно, менее статически отформатировано, если вы понимаете, что я имею в виду?

Я пишу краткую программу, которая будет использовать продолжительность TimeSpan двух объектов DateTime и выводит их для печати на бумагу.

Формат, который будет предпочтительнее: XX days, YY hours, ZZ minutes (секунды неактуальны, как и дни, потому что я не ожидаю, что временной интервал будет включать более нескольких часов).

Скажите следующий код (в качестве примера):

DateTime start = DateTime.Now;
DateTime end = DateTime.Now.AddMinutes(135);
TimeSpan duration = (end - start);

// output duration as XX hours, YY minutes

Спасибо,
Zack

P.S. Я также столкнулся с " PrettyTime.NET", но он выводит такие вещи, как "3 дня назад" и т.д. Все остальные темы, которые я нашел в google для форматирования строк времени, подобных приведенным выше примерам, приводит меня к решению на основе Java.:\


ОБНОВЛЕНИЕ 2014-09-08:

Чтобы следить за 3 годами, я нашел потрясающую библиотеку в NuGet и Github, назвав " Humanizer, которая решить этот вопрос, который у меня был. Я не использовал его так сильно, но я попробовал, и он прекрасно работает. Это довольно большая библиотека (она выделяет целую кучу папок для разных культур на ваш путь построения проекта (я уверен, что есть способ ее настроить)).

Ответ 1

И если вы заботитесь о плюрализации:

public static string ToPrettyFormat(this TimeSpan span) {

    if (span == TimeSpan.Zero) return "0 minutes";

    var sb = new StringBuilder();
    if (span.Days > 0)
        sb.AppendFormat("{0} day{1} ", span.Days, span.Days > 1 ? "s" : String.Empty);
    if (span.Hours > 0)
        sb.AppendFormat("{0} hour{1} ", span.Hours, span.Hours > 1 ? "s" : String.Empty);
    if (span.Minutes > 0)
        sb.AppendFormat("{0} minute{1} ", span.Minutes, span.Minutes > 1 ? "s" : String.Empty);
    return sb.ToString();

}

Ответ 2

Вы можете просто вывести это прямо:

 string result = string.Format("{0} days, {1} hours, {2} minutes", duration.Days, duration.Hours, duration.Minutes);

Если вы собираетесь обрабатывать "короткие" времена, и вы хотите, чтобы это было более чистым, вы могли бы сделать что-то вроде:

public string PrettyFormatTimeSpan(TimeSpan span)
{
    if (span.Days > 0)
         return string.Format("{0} days, {1} hours, {2} minutes", span.Days, span.Hours, span.Minutes);
    if (span.Hours > 0)
         return string.Format("{0} hours, {1} minutes", span.Hours, span.Minutes);

    return  string.Format("{0} minutes", span.Minutes);
}