Формат TimeSpan ToString


95

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

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

myTimeSpan.ToString("hh mm ss")

Ответы:


144

Пытаться:

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

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

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

РЕДАКТИРОВАТЬ: Как уже отмечалось, это не сработает более 24 часов. Также обратите внимание, что альтернативы также доступны через Noda Time :)


5
См. Ответ Dimension, потому что он не будет правильно форматировать время в 24 часа или дольше.
— Скотт

"dd'd 'hh'h' mm'm '" - у меня это работает. Учтите, что форматированный текст нужно обернуть апострофами: «dd'days made '». Здесь dd - это мир данных и «дни, проведенные» ваш собственный текст »
— Павел Шклейник

38

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

// 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 и создает форматирование на основе того, превышает ли временной интервал год, день и т. Д. Или вы можете просто всегда показывать дни, потому что они никогда не обрезаются:

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

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

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


15
Вот почему у вас есть и TotalHoursт.д. в TimeSpan. Вы, наверное, хотели этогоMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
— Аксимили 05

17

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

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

9
Для кода, который должен поддерживать> 24 часов, это решение TotalHoursпо-прежнему подходит даже в более новых версиях .net.
— CodesInChaos 04

1
Я на самом деле считаю это лучше, так как этому можно просто доверять.
— Крис Марисич

Будьте осторожны, если вы используете TotalHours, as that is a double, not an intlike Hoursis, т.е. он будет показывать доли часов, а также целые часы.
— Jinlye

6

как насчет конкактенации:

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

ОБНОВЛЕНИЕ 1:

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


11
Если вы собираетесь использовать конкатенацию, вы можете также использовать Hours, Minutes, Secondsсвойство ИМО. Я лично предпочел бы использовать строку настраиваемого формата после выяснения цитирования.
— Джон Скит


5

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

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

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


2

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.