TimeSpan ToString-indeling

Gewoon nieuwsgierig, is er een format string die ik kan gebruiken om iets als “5h 3m 30s” uit te voeren?

bijv. (duidelijk fout)

myTimeSpan.ToString("hh mm ss")

Antwoord 1, autoriteit 100%

Probeer:

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

(Merk op dat zelfs spaties tussen aanhalingstekens moeten staan ​​- dat was wat er mis was met mijn eerste poging.)

Ik neem aan dat je natuurlijk .NET 4 gebruikt – daarvoor ondersteunde TimeSpangeen strings met aangepaste indelingen.

EDIT: zoals vermeld, werkt dit niet langer dan 24 uur. Houd er ook rekening mee dat er ook alternatieven beschikbaar zijn via Noda Time🙂


Antwoord 2, autoriteit 29%

Houd hier rekening mee bij het gebruik van het antwoord van Jon Skeet, met code als deze:

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

U krijgt de volgende resultaten:

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

Het uurformaat kan maximaal 23 uur weergeven. Het zal geen 27 uur weergeven of de 12 dagen omzetten in uren, het zal ze gewoon afsnijden alsof ze nooit hebben bestaan.

Een manier om dit op te lossen is door een extensie te maken die de lengte van de TimeSpan controleert en opmaak maakt op basis van of de tijdspanne langer is dan een jaar, dag, enz. Of je kunt ook gewoon altijd dagen laten zien omdat ze nooit afbreken:

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

Houd er rekening mee dat ik een beginner ben in programmeren. Dit komt alleen uit waarnemingen nadat ik het geluk had dit op te merken nadat ik had aangenomen dat het alle uren zou tonen. Ik zeg dit omdat ik niet weet of er een betere oplossing is, zoals een ander uurformaat dat eindeloze uren kan weergeven.

Ik denk echter dat dit formaat zijn beoogde functionaliteit doet. Je moet je er gewoon van bewust zijn. Zo dit bericht. Het antwoord van Jon Skeet heeft nooit aangegeven dat dit formaat alleen de eigenschap uur moet tonen van een datumtypeformaat waarbij de uren maximaal 23 kunnen zijn.


Antwoord 3, autoriteit 14%

Als je de pech hebt om .NET4 niet te gebruiken:

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

Antwoord 4, autoriteit 6%

Met behulp van Xamarinen .NET Portable 4.5was dit het enige formaat dat ik kreeg nadat ik alle andere antwoorden hier had geprobeerd:

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

In wezen plaats ik de :tussen enkele aanhalingstekens om eraan te ontsnappen.


Antwoord 5, autoriteit 5%

Dit kleine codevoorbeeld zou je moeten helpen om TimeSpan te ontleden en omgekeerd:

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;

Referentie: Aangepaste tekenreeksen voor TimeSpan-indeling


Antwoord 6, autoriteit 4%

hoe zit het met aaneenschakeling:

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

UPDATE 1:

Je kunt er aan ontsnappen met een enkel aanhalingsteken: h'h 'm'm 's's'


Antwoord 7, autoriteit 3%

Soms vind ik opmaakstrings een beetje zoals regexes, in die zin dat wanneer ik later terugkom op de code, ik de nuances ben vergeten. Ik heb daarom gekozen voor het volgende, waardoor ik minder snel de documentatie terug krijg:

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

String-interpolatie, geïntroduceerd in C# 6, maakt dit een stuk duidelijker dan het anders zou zijn.

Other episodes