Format TimeSpan ToString


95

Ciekawe, czy istnieje ciąg formatu, którego mogę użyć do wypisania czegoś w rodzaju „5h 3m 30s”?

na przykład. (oczywiście źle)

myTimeSpan.ToString("hh mm ss")

Odpowiedzi:


144

Próbować:

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

(Zwróć uwagę, że nawet spacje muszą być cytowane - to właśnie było nie tak przy mojej pierwszej próbie).

Zakładam, że oczywiście używasz platformy .NET 4. Wcześniej TimeSpan nie obsługiwał niestandardowych ciągów formatu.

EDYCJA: Jak wspomniano, to nie będzie działać dłużej niż 24 godziny. Pamiętaj również, że alternatywy są również dostępne za pośrednictwem Noda Time :)


5
Zobacz odpowiedź programu Dimension, ponieważ ten nie sformatuje poprawnie czasów 24-godzinnych lub dłuższych.
Scott,

„dd'd 'hh'h' mm'm '” - to działa dla mnie. Weź pod uwagę, że musisz otoczyć sformatowany tekst apostrofami: "dd'days spędzone '". Tutaj dd to spokój danych i
``

38

Pamiętaj o tym, używając odpowiedzi od Jona Skeeta, z następującym kodem:

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

Otrzymujesz takie wyniki:

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

Format godzinowy może pokazywać maksymalnie 23 godziny. Nie pokaże 27 godzin ani nie zamieni 12 dni na godziny, po prostu je odetnie, jakby nigdy nie istniały.

Jednym ze sposobów rozwiązania tego problemu byłoby utworzenie rozszerzenia, które sprawdza długość TimeSpan i tworzy formatowanie na podstawie tego, czy przedział czasu przekracza rok, dzień itd. Lub możesz po prostu zawsze pokazywać również dni, ponieważ nigdy się nie kończą:

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

Zwróć uwagę, że jestem początkującym programistą. Wynika to z obserwacji po tym, jak miałem szczęście to zauważyć po założeniu, że będzie pokazywać wszystkie godziny. Mówię to, ponieważ nie wiem, czy istnieje lepsze rozwiązanie, takie jak inny format godzinowy, który może wyświetlać nieskończone godziny.

Myślę jednak, że ten format spełnia swoją zamierzoną funkcjonalność. Po prostu musisz być tego świadomy. Stąd ten post. Odpowiedź Jona Skeeta nigdy nie wskazywała, że ​​ten format ma pokazywać tylko właściwość godziny formatu typu daty, w którym godziny mogą wynosić maksymalnie 23.


15
Dlatego masz TotalHoursitp. W TimeSpan. Prawdopodobnie tego chciałeśMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili

17

Jeśli masz pecha, że ​​nie używasz .NET4:

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

9
W przypadku kodu, który musi obsługiwać> 24 godziny, to rozwiązanie TotalHoursjest nadal do zrobienia nawet w nowszych wersjach .net.
CodesInChaos

1
Właściwie uważam to za lepsze, ponieważ możesz temu po prostu zaufać.
Chris Marisic,

Uważaj, jeśli używasz TotalHours, ponieważ jest to a double, a nie intjak Hoursjest, tj. Pokaże ułamki godzin, a także całe godziny.
Jinlye,

6

co z konkaktenacją:

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

AKTUALIZACJA 1:

Możesz uciec za pomocą pojedynczego cudzysłowu: h'h 'm'm 's's'


11
Jeśli masz zamiar używać konkatenacji, równie dobrze można użyć Hours, Minutes, Secondswłaściwości IMO. Osobiście wolałbym użyć niestandardowego ciągu formatu, po ustaleniu cytowania.
Jon Skeet

6

Ten mały kod pomaga w analizowaniu i cofaniu:

        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;

Odniesienie do analizy przedziału czasu


5

Używając Xamarini .NET Portable 4.5był to jedyny format, jaki uzyskałem po wypróbowaniu wszystkich innych odpowiedzi tutaj:

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

Zasadniczo umieszczam :w pojedynczych cudzysłowach, aby od nich uciec.


2

Czasami uważam, że ciągi formatujące są trochę podobne do wyrażeń regularnych, ponieważ kiedy wracam do kodu później, zapomniałem o niuansach. Dlatego zdecydowałem się na następujące, co jest mniej prawdopodobne, aby odesłać mi dokumentację:

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

Interpolacja ciągów, wprowadzona w C # 6, sprawia, że ​​jest to o wiele jaśniejsze, niż byłoby inaczej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.