TimeSpan ToString-Format

95

Nur neugierig, gibt es eine Formatzeichenfolge, mit der ich so etwas wie "5h 3m 30s" ausgeben kann?

z.B. (offensichtlich falsch)

myTimeSpan.ToString("hh mm ss")
Aximili
quelle

Antworten:

143

Versuchen:

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

(Beachten Sie, dass sogar Leerzeichen in Anführungszeichen gesetzt werden müssen - das war bei meinem ersten Versuch falsch.)

Ich gehe natürlich davon aus, dass Sie .NET 4 verwenden - zuvor wurden TimeSpanbenutzerdefinierte Formatzeichenfolgen nicht unterstützt.

EDIT: Wie bereits erwähnt, funktioniert dies nicht länger als 24 Stunden. Beachten Sie auch, dass Alternativen auch über Noda Time verfügbar sind :)

Jon Skeet
quelle
5
Siehe die Antwort von Dimension, da diese Zeiten von 24 Stunden oder länger nicht korrekt formatiert.
Scott
"dd'd 'hh'h' mm'm '" - das funktioniert bei mir. Berücksichtigen Sie, dass Sie Ihren formatierten Text mit Apostrophen umschließen müssen: "Tage verbracht". Hier ist dd Ruhe der Daten und "Tage verbracht" Ihren eigenen Text "
Pavel Shkleinik
37

Beachten Sie dies, wenn Sie die Antwort von Jon Skeet mit folgendem Code verwenden:

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

Sie erhalten Ergebnisse wie diese:

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

Das Stundenformat kann maximal 23 Stunden anzeigen. Es werden keine 27 Stunden angezeigt oder die 12 Tage in Stunden umgerechnet, sondern sie werden einfach abgeschnitten, als ob sie nie existiert hätten.

Eine Möglichkeit, dies zu beheben, besteht darin, eine Erweiterung zu erstellen, die die Länge der Zeitspanne überprüft und eine Formatierung basierend darauf erstellt, ob die Zeitspanne mehr als ein Jahr, einen Tag usw. beträgt. Oder Sie könnten einfach immer auch Tage zeigen, weil sie nie abschneiden:

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

Beachten Sie, dass ich ein Anfänger im Programmieren bin. Dies kommt erst von Beobachtungen, nachdem ich das Glück hatte, dies zu bemerken, nachdem ich angenommen hatte, dass es alle Stunden zeigen würde. Ich sage das, weil ich nicht weiß, ob es eine bessere Lösung gibt, wie ein anderes Stundenformat, das endlose Stunden anzeigen kann.

Ich denke jedoch, dass dieses Format seine beabsichtigte Funktionalität erfüllt. Man muss sich nur dessen bewusst sein. Also dieser Beitrag. Die Antwort von Jon Skeet zeigte nie an, dass dieses Format nur die Stundeigenschaft eines Datumsformats anzeigen soll, bei dem die Stunden höchstens 23 sein können.

Abmessungen
quelle
14
Deshalb haben Sie TotalHoursetc in TimeSpan. Sie wollten das wahrscheinlichMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili
17

Wenn Sie das Pech haben, .NET4 nicht zu verwenden:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);
Holf
quelle
9
Für Code, der> 24h unterstützen muss, ist diese Lösung TotalHoursauch in neueren Versionen von .net noch der richtige Weg.
CodesInChaos
1
Ich finde das tatsächlich besser, da man ihm einfach vertrauen kann.
Chris Marisic
Vorsicht bei der Verwendung TotalHours, da dies ein istdouble , kein intähnliches Hoursist, dh es werden Bruchteile von Stunden sowie ganze Stunden angezeigt.
Jinlye
6

Wie wäre es mit einer Verdichtung?

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

UPDATE 1:

Sie können es mit einem einfachen Anführungszeichen entkommen: h'h 'm'm 's's'

John Woo
quelle
11
Wenn Sie vorhaben , Verkettung zu verwenden, könnte man genauso gut verwendet die Hours, Minutes, SecondsIMO Eigenschaften. Ich persönlich würde lieber eine benutzerdefinierte Formatzeichenfolge verwenden, nachdem ich das Zitat herausgefunden habe.
Jon Skeet
6

Dieser kleine Code hilft beim Parsen und Zurückkehren:

        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;

Referenz für die Zeitspannenanalyse

Zamoldar
quelle
5

Verwenden Xamarinund und .NET Portable 4.5dies war das einzige Format, das ich zum Arbeiten bekam, nachdem ich alle anderen Antworten hier ausprobiert hatte:

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

Im Wesentlichen setze ich die :in einfache Anführungszeichen, um ihnen zu entkommen.

Jonas Stensved
quelle
2

Ich finde Formatzeichenfolgen manchmal ein wenig wie reguläre Ausdrücke. Wenn ich später auf den Code zurückkomme, habe ich die Nuancen vergessen. Ich habe mich daher für Folgendes entschieden, was mir die Dokumentation weniger wahrscheinlich zurückschickt:

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

Die in C # 6 eingeführte String-Interpolation macht dies viel klarer als sonst.

Giles
quelle