2012-06-18 12 views
76

Po prostu ciekawy, czy istnieje ciąg formatu, którego można użyć do wyprowadzenia czegoś takiego jak "5h 3m 30s"?Format TimeSan ToString

np. (Oczywiście źle)

myTimeSpan.ToString("hh mm ss") 

Odpowiedz

126

Spróbuj:

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

(Należy pamiętać, że muszą być notowane nawet przestrzenie - to, co się stało z moją pierwszą próbę.)

Ja zakładając, że” ponownie korzystamy z platformy .NET 4 - wcześniej, TimeSpan nie obsługuje ciągów w niestandardowym formacie.

EDYCJA: Jak zaznaczono, nie będzie to działać po 24 godzinach. Należy również pamiętać, że alternatywy są dostępne za pośrednictwem Noda Time też :)

+3

Zobacz odpowiedź wymiaru, ponieważ ta nie sformatuje poprawnie czasu 24 godzin lub dłużej. – Scott

+0

"dd'd" hh'h "mm'm" "- to działa dla mnie. Weź pod uwagę, że musisz zawinąć sformatowany tekst za pomocą apostrofów: "dni spędzone dd". Tutaj dd to spokój danych i "dni spędzone" na własnym tekście " –

6

jak o concactenation:

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

UPDATE 1:

Można uciec z pojedynczym Cytat: h'h 'm'm 's's'

+10

Jeśli zamierzasz używać konkatenacji, równie dobrze możesz użyć właściwości IMO" Godziny "," Minuty "," Sekundy ". Osobiście wolałbym używać niestandardowego ciągu formatu, po zastanowieniu się nad cytowaniem. –

28

być tego świadomi podczas korzystania z odpowiedzi od Jona Skeeta, z kodem takim:

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

uzyskać wyniki takie jak:

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

formacie godzina może w maksymalnej Pokaż 23 godzin. Nie wykaż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 w oparciu o to, czy okres wynosi ponad rok, dzień, itd. Lub możesz po prostu zawsze pokazywać dni, ponieważ nigdy nie odcinają się:

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

Pamiętaj, że jestem początkującym programistą. Wynika to z obserwacji po tym, jak udało mi się to zauważyć po tym, jak założyłem, że będzie to oznaczać wszystkie godziny. Mówię to, ponieważ nie wiem, czy istnieje lepsze rozwiązanie, takie jak inny format godziny, który może wyświetlać niekończące się godziny.

Uważam jednak, że ten format spełnia zamierzoną funkcję. Musisz tylko być tego świadomy. Tak więc ten post. Odpowiedź Jona Skeeta nigdy nie wskazywała, że ​​ten format ma pokazywać tylko właściwość godzinową formatu typu daty, w której godziny mogą wynosić najwyżej 23.

+9

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

15

Jeśli jesteś nieszczęśliwy, nie możesz z niego skorzystać.NET4:

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

Dla kodu, który musi obsługiwać> 24h, to rozwiązanie z' TotalHours' jest nadal sposób, aby przejść nawet w nowszych wersjach .net. – CodesInChaos

+1

Rzeczywiście znajduję to lepiej, ponieważ możesz po prostu mu zaufać. –

+0

Uwaga, jeśli używasz 'TotalHours', ponieważ jest to' double', a nie 'int' jak' Hours', to znaczy pokazuje ułamki godzin, a także całe godziny. – Jinlye

4

Ten mały kod pomaga, do analizowania i odwrócić z powrotem:

 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; 

Referance for timespan parse

2

Korzystanie Xamarin i .NET Portable 4.5 był to jedyny format dostałem pracę po wypróbowaniu wszystkich innych odpowiedzi tutaj :

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

Essenti sojusznika Wstawiam : w pojedyncze cudzysłowy, aby uciec od nich.