TimeSpan FormatString с дополнительными часами

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

3:30 (hours not displayed, showing only full minutes)
13:30 
1:13:30 (shows only full hours instead of 01:13:30)

До сих пор я:

string TimeSpanText = string.Format("{0:h\\:mm\\:ss}", MyTimeSpan);

но это не дает вышеуказанных результатов. Как я могу достичь желаемых результатов?

Ответ 1

Я не думаю, что одна строка формата даст вам то, что вы хотите, но создание самого результата - простая задача:

public string FormatTimeSpan(TimeSpan ts)
{
    var sb = new StringBuilder();

    if ((int) ts.TotalHours > 0)
    {
        sb.Append((int) ts.TotalHours);
        sb.Append(":");
    }

    sb.Append(ts.Minutes.ToString("m"));
    sb.Append(":");
    sb.Append(ts.Seconds.ToString("ss"));

    return sb.ToString();
}

EDIT: лучшая идея!

Вы можете сделать метод выше метода расширения в классе TimeSpan следующим образом:

public static class Extensions
{
    public static string ToMyFormat(this TimeSpan ts)
    {
        // Code as above.
    }
}

Затем использовать это так же просто, как вызвать ts.ToMyFormat().

Ответ 2

Возможно, вы хотите что-то вроде

string TimeSpanText = string.Format(
    MyTimeSpan.TotalHours >= 1 ? @"{0:h\:mm\:ss}" : @"{0:mm\:ss}",
    MyTimeSpan);