Формат TimeSpan ToString


просто любопытно, есть ли строка формата, которую я могу использовать для вывода чего-то вроде "5h 3m 30s"?

например. (очевидно, неправильно)

myTimeSpan.ToString("hh mm ss")
7 81

7 ответов:

попробуй:

myTimeSpan.ToString("h'h 'm'm 's's'")

(обратите внимание, что даже пробелы нужно цитировать - вот что было не так с моей первой попыткой.)

Я предполагаю, что вы используете .NET 4, Конечно-до этого,TimeSpan не поддерживает строки пользовательского формата.

EDIT: как уже отмечалось, это не будет работать за 24 часа. Также обратите внимание, что альтернативы доступны через Нода Времени тоже :)

имейте это в виду при использовании ответа от Джона Скита, с таким кодом:

// 12 days, 23 hours, 24 minutes, 2 seconds.
TimeSpan span = new TimeSpan(12, 23, 24, 2);
// 27 hours, 24 minutes, 2 seconds
TimeSpan span2 = new TimeSpan(27,24,2);

string format = span.ToString("h'h 'm'm 's's'");
string format2 = span2.ToString("h'h 'm'm 's's'");
Console.WriteLine(format);
Console.WriteLine(format2);
Console.ReadLine();

вы получаете такие результаты:

23h 24m 2s
3h 24m 2s

формат часа может на максимуме показать 23 часа. Он не будет показывать 27 часов или преобразовывать 12 дней в часы, он просто отключит их, как если бы они никогда не существовали.

одним из способов исправить это было бы создать расширение, которое проверяет длину TimeSpan и создает форматирование на основе того, если timespan превышает a год, День, ЭСТ. Или вы можете просто всегда показывать дни, потому что они никогда не отрезают:

string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");

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

однако я думаю, что этот формат делает ее предназначению. Вы просто нужно осознавать это. Таким образом этот пост. Ответ Джона Скита никогда не указывал, что этот формат должен показывать только свойство hour формата типа даты, где часы могут быть не более 23.

Если вам не повезло не использовать. NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);

Как насчет concactenation:

String oTime = myTimeSpan.ToString("h") + "h " +
               myTimeSpan.ToString("m") + "m " +
               myTimeSpan.ToString("s") + "s "

обновление 1:

вы можете избежать его с одной кавычкой:h'h 'm'm 's's'

этот код помогает, для разбора и обратного обратно:

        var t = TimeSpan.FromMilliseconds(450780);

        double d1 = t.TotalSeconds;


        string t3 = t.ToString(@"hh\:mm\:ss\.f",null);


        var tt = TimeSpan.ParseExact(t3, @"hh\:mm\:ss\.f",null);
        double d2 = tt.TotalSeconds;

Reference для временного разбора

используя Xamarin и .NET Portable 4.5 это был единственный формат, который я получил работу после попытки всех других ответов здесь:

timespan.ToString("hh':'mm':'ss");

по сути, я ставлю : в одинарных кавычках, чтобы избежать их.

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

string FormatTimeSpan(TimeSpan timeSpan) =>
    $"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";

строковая интерполяция, введенная в C# 6, делает это намного яснее, чем это было бы в противном случае.