Просто любопытно, есть ли строка формата, которую я могу использовать для вывода чего-то вроде "5h 3m 30s"?
например. (очевидно неправильно)
myTimeSpan.ToString("hh mm ss")
Ответы:
Пытаться:
myTimeSpan.ToString("h'h 'm'm 's's'")
(Обратите внимание, что даже пробелы должны быть заключены в кавычки - вот что было не так с моей первой попыткой.)
Я предполагаю, что вы, конечно, используете .NET 4 - до этого TimeSpanне поддерживали строки настраиваемого формата.
РЕДАКТИРОВАТЬ: Как уже отмечалось, это не сработает более 24 часов. Также обратите внимание, что альтернативы также доступны через Noda Time :)
Помните об этом при использовании ответа Джона Скита с таким кодом:
// 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.
TotalHoursт.д. в TimeSpan. Вы, наверное, хотели этогоMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Если вам не повезло, что вы не используете .NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
TotalHoursпо-прежнему подходит даже в более новых версиях .net.
TotalHours, as that is a double, not an intlike Hoursis, т.е. он будет показывать доли часов, а также целые часы.
как насчет конкактенации:
String oTime = myTimeSpan.ToString("h") + "h " +
myTimeSpan.ToString("m") + "m " +
myTimeSpan.ToString("s") + "s "
ОБНОВЛЕНИЕ 1:
Вы можете избежать этого с помощью одинарной кавычки: h'h 'm'm 's's'
Hours, Minutes, Secondsсвойство ИМО. Я лично предпочел бы использовать строку настраиваемого формата после выяснения цитирования.
Этот небольшой код помогает для синтаксического анализа и возврата:
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;
Использование 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, делает это намного яснее, чем это было бы в противном случае.