Formato TimeSpan ToString


95

Só por curiosidade, existe uma string de formato que posso usar para gerar algo como "5h 3m 30s"?

por exemplo. (obviamente errado)

myTimeSpan.ToString("hh mm ss")

Respostas:


143

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 :)


5
Veja a resposta da Dimension, pois esta não formatará corretamente os horários de 24 horas ou mais.
Scott

"dd'd 'hh'h' mm'm '" - isso funciona para mim. Leve em consideração que você precisa envolver o texto formatado com apóstrofos: "dd'days gastou '". Aqui, o dd tem paz de dados e 'dias passados' seu próprio texto '
Pavel Shkleinik

37

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.


14
É por isso que você tem TotalHoursetc. no TimeSpan. Você provavelmente queria issoMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili,

17

Se você tiver a infelicidade de não usar .NET4:

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

9
Para código que precisa suportar> 24h, esta solução TotalHoursainda é o caminho a percorrer, mesmo em versões mais recentes do .net.
CodesInChaos

1
Na verdade, acho isso melhor, já que você pode simplesmente confiar.
Chris Marisic

Cuidado se utilizando TotalHours, como um que é double, não uma intcomo Hoursé, ou seja, ele vai mostrar fracções de horas, bem como horas inteiras.
Jinlye

6

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'


11
Se você estiver indo para usar concatenação, assim como você pode usar o Hours, Minutes, Secondspropriedades da OMI. Eu pessoalmente prefiro usar uma string de formato personalizado, depois de descobrir as citações.
Jon Skeet de

6

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;

Referência para análise do intervalo de tempo


5

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.


2

À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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.