Risposte:
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 :)
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.
TotalHoursecc. In TimeSpan. Probabilmente lo voleviMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Se sei abbastanza sfortunato da non utilizzare .NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
TotalHoursè ancora la strada da percorrere anche nelle versioni più recenti di .net.
TotalHours, poiché è un double, non è un intsimile Hours, cioè mostrerà frazioni di ore e ore intere.
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'
Hours, Minutes, Secondsproprietà IMO. Personalmente preferirei usare una stringa di formato personalizzata, dopo aver capito la citazione.
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;
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.
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.