Formato TimeSpan ToString


95

Solo curioso, c'è una stringa di formato che posso usare per produrre qualcosa come "5h 3m 30s"?

per esempio. (ovviamente sbagliato)

myTimeSpan.ToString("hh mm ss")

Risposte:


143

Provare:

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

(Nota che anche gli spazi devono essere citati: questo è ciò che non andava nel mio primo tentativo.)

Suppongo che tu stia usando .NET 4, ovviamente - prima di allora, TimeSpannon supportava le stringhe di formato personalizzate.

EDIT: come notato, questo non funzionerà oltre le 24 ore. Si noti inoltre che le alternative sono disponibili anche tramite Noda Time :)


5
Vedi la risposta di Dimension, perché questa non formatterà correttamente i tempi di 24 ore o più.
Scott

"dd'd 'hh'h' mm'm '" - questo funziona per me. Tieni presente che devi racchiudere il testo formattato con apostrofi: "gg'giorni trascorsi '". Qui dd è la pace dei dati e dei 'giorni trascorsi' il tuo testo '
Pavel Shkleinik

37

Sii consapevole di questo quando usi la risposta di Jon Skeet, con un codice come questo:

// 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();

Ottieni risultati come questi:

23h 24m 2s
3h 24m 2s

Il formato orario può mostrare al massimo 23 ore. Non mostrerà 27 ore né convertirà i 12 giorni in ore, semplicemente le interromperà come se non fossero mai esistite.

Un modo per risolvere questo problema sarebbe creare un'estensione che controlli la lunghezza del TimeSpan e crei la formattazione in base al fatto che l'intervallo di tempo sia superiore a un anno, giorno, ecc. Oppure potresti semplicemente mostrare anche i giorni perché non vengono mai interrotti:

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

Nota che sono un principiante nella programmazione. Questo viene solo dalle osservazioni dopo che ho avuto la fortuna di notarlo dopo aver pensato che avrebbe mostrato tutte le ore. Lo dico perché non so se esiste una soluzione migliore, come un altro formato ora che può visualizzare infinite ore.

Tuttavia, penso che questo formato stia facendo le funzionalità previste. Devi solo esserne consapevole. Quindi questo post. La risposta di Jon Skeet non ha mai indicato che questo formato deve mostrare solo la proprietà ora di un formato di tipo data in cui le ore possono essere al massimo 23.


14
Ecco perché hai TotalHoursecc. In TimeSpan. Probabilmente lo voleviMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili

17

Se sei abbastanza sfortunato da non utilizzare .NET4:

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

9
Per il codice che deve supportare> 24 ore, questa soluzione TotalHoursè ancora la strada da percorrere anche nelle versioni più recenti di .net.
CodesInChaos

1
In realtà lo trovo migliore poiché puoi semplicemente fidarti.
Chris Marisic

Attenzione se si utilizza TotalHours, poiché è un double, non è un intsimile Hours, cioè mostrerà frazioni di ore e ore intere.
Jinlye

6

che ne dici della concatenazione:

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

AGGIORNAMENTO 1:

Puoi evaderlo con virgolette singole: h'h 'm'm 's's'


11
Se avete intenzione di utilizzare la concatenazione, si potrebbe anche utilizzare il Hours, Minutes, Secondsproprietà IMO. Personalmente preferirei usare una stringa di formato personalizzata, dopo aver capito la citazione.
Jon Skeet

6

Questo piccolo codice aiuta, per analizzare e invertire:

        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;

Riferimento per l'analisi dell'intervallo di tempo


5

Usando Xamarine .NET Portable 4.5questo è stato l'unico formato che ho ottenuto dopo aver provato tutte le altre risposte qui:

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

Essenzialmente sto mettendo le :virgolette singole per sfuggirle.


2

A volte trovo le stringhe di formato un po 'come le espressioni regolari, in quanto quando torno al codice più tardi, ho dimenticato le sfumature. Sono quindi andato con quanto segue, che è meno probabile che mi rispedisca la documentazione:

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

L'interpolazione di stringhe, introdotta in C # 6, lo rende molto più chiaro di quanto sarebbe altrimenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.