TimeSpan формат "красивое время" в C # - PullRequest
15 голосов
/ 26 марта 2011

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

Я пишу быструю программу, которая будет принимать длительность 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

Спасибо,Зак

PS Я также наткнулся на " PrettyTime.NET ", но он выводит такие вещи, как "3 дня назад" и т. Д. Любая другая тема, которую я нашел в Google для форматирования строк длительности времени, напримерПриведенные выше примеры приводят меня к решению на основе Java.: \


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

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

Ответы [ 3 ]

32 голосов
/ 26 марта 2011

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

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

}
9 голосов
/ 26 марта 2011

Вы можете просто вывести это напрямую:

 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);
}
1 голос
/ 20 марта 2018

С C # 7:

string FormatTimeSpan(TimeSpan timeSpan)
{
    string FormatPart(int quantity, string name) => quantity > 0 ? $"{quantity} {name}{(quantity > 1 ? "s" : "")}" : null;
    return string.Join(", ", new[] { FormatPart(timeSpan.Days, "day"), FormatPart(timeSpan.Hours, "hour"), FormatPart(timeSpan.Minutes, "minute") }.Where(x => x != null));
}
...