Respostas:
Experimentar:
myTimeSpan.ToString("h'h 'm'm 's's'")
(Observe que até mesmo os espaços precisam ser citados - isso é o que estava errado na minha primeira tentativa.)
Estou assumindo que você está usando o .NET 4, é claro - antes disso, TimeSpannão suportava strings de formato personalizado.
EDIT: Conforme observado, isso não funcionará além de 24 horas. Observe também que as alternativas estão disponíveis via Noda Time :)
Esteja ciente disso ao usar a resposta de Jon Skeet, com código como este:
// 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();
Você obtém resultados como estes:
23h 24m 2s
3h 24m 2s
O formato da hora pode mostrar no máximo 23 horas. Não mostrará 27 horas nem converterá os 12 dias em horas, simplesmente os cortará como se nunca tivessem existido.
Uma maneira de corrigir isso seria criar uma extensão que verifica a duração do TimeSpan e cria a formatação com base em se o intervalo de tempo é superior a um ano, dia, etc. Ou você pode simplesmente sempre mostrar os dias, porque eles nunca cortam:
string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");
Observe que sou um iniciante em programação. Isso só vem de observações depois que tive a sorte de perceber isso depois de presumir que mostraria todas as horas. Estou dizendo isso porque não sei se existe uma solução melhor, como outro formato de hora que pode exibir horas infinitas.
No entanto, acho que este formato está cumprindo a funcionalidade pretendida. Você apenas tem que estar ciente disso. Assim, este post. A resposta de Jon Skeet nunca indicou que esse formato é para mostrar apenas a propriedade de hora de um formato de tipo de data em que as horas podem ser no máximo 23.
TotalHoursetc. no TimeSpan. Você provavelmente queria issoMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Se você tiver a infelicidade de não usar .NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
TotalHoursainda é o caminho a percorrer, mesmo em versões mais recentes do .net.
TotalHours, como um que é double, não uma intcomo Hoursé, ou seja, ele vai mostrar fracções de horas, bem como horas inteiras.
que tal concatenação:
String oTime = myTimeSpan.ToString("h") + "h " +
myTimeSpan.ToString("m") + "m " +
myTimeSpan.ToString("s") + "s "
ATUALIZAÇÃO 1:
Você pode escapar com aspas simples: h'h 'm'm 's's'
Hours, Minutes, Secondspropriedades da OMI. Eu pessoalmente prefiro usar uma string de formato personalizado, depois de descobrir as citações.
Este pequeno código ajuda, para analisar e reverter:
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;
Usando Xamarine .NET Portable 4.5este foi o único formato que consegui funcionar depois de tentar todas as outras respostas aqui:
timespan.ToString("hh':'mm':'ss");
Basicamente, estou colocando :aspas simples para evitá-las.
Às vezes, encontro strings de formato um pouco como regexes, pois quando volto ao código mais tarde, esqueci as nuances. Portanto, optei pelo seguinte, que é menos provável que me devolva a documentação:
string FormatTimeSpan(TimeSpan timeSpan) =>
$"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";
A interpolação de strings, introduzida no C # 6, está deixando isso muito mais claro do que seria de outra forma.