Просто любопытно, есть ли строка формата, которую я могу использовать для вывода чего-то вроде "5h 3m 30s"?
например. (очевидно, неправильно)
myTimeSpan.ToString("hh mm ss")
Просто любопытно, есть ли строка формата, которую я могу использовать для вывода чего-то вроде "5h 3m 30s"?
например. (очевидно, неправильно)
myTimeSpan.ToString("hh mm ss")
Try:
myTimeSpan.ToString("h'h 'm'm 's's'")
(Обратите внимание, что даже пробелы должны быть указаны - что было не так с моей первой попыткой.)
Я предполагаю, что вы используете .NET 4, конечно - до этого TimeSpan
не поддерживал строки пользовательского формата.
EDIT: Как уже отмечалось, это не будет работать более 24 часов. Также обратите внимание, что альтернативы доступны через Noda Time:)
Помните об этом, когда используете ответ от Jon Skeet, с таким кодом:
// 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'");
Заметьте, что я новичок в программировании. Это происходит только из наблюдений после того, как мне посчастливилось заметить это, предположив, что это будет показывать все часы. Я говорю об этом, потому что я не знаю, есть ли лучшее решение, например, другой формат часов, который может отображать бесконечные часы.
Однако я считаю, что этот формат выполняет намеченные функции. Вы просто должны знать об этом. Таким образом, этот пост. Ответ Jon Skeet никогда не указывал, что этот формат должен показывать только свойство часа формата даты, где часы могут быть не более 23.
Если вы, к сожалению, не используете .NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
как насчет конкременции:
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;
Используя 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";
Строковая интерполяция, введенная в С# 6, делает это намного яснее, чем могло бы быть.
string s = string.Format("{0} {1} {2}", ts.Hours, ts.Minutes, ts.Minutes);