Format TimeSpan ToString

95

Juste curieux, y a-t-il une chaîne de format que je peux utiliser pour produire quelque chose comme "5h 3m 30s"?

par exemple. (évidemment faux)

myTimeSpan.ToString("hh mm ss")
Aximili
la source

Réponses:

143

Essayer:

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

(Notez que même les espaces doivent être cités - c'est ce qui n'allait pas lors de ma première tentative.)

Je suppose que vous utilisez .NET 4, bien sûr - avant cela, TimeSpanne prenait pas en charge les chaînes de format personnalisées.

EDIT: Comme indiqué, cela ne fonctionnera pas au-delà de 24 heures. Notez également que des alternatives sont également disponibles via Noda Time :)

Jon Skeet
la source
5
Voir la réponse de Dimension, car celle-ci ne formatera pas correctement les heures de 24 heures ou plus.
Scott
"jj'd 'hh'h' mm'm '" - cela fonctionne pour moi. Tenez compte du fait que vous devez envelopper votre texte mis en forme avec des apostrophes: "jj" jours passés "". Ici jj est la paix des données et les `` jours passés '' à votre propre texte ''
Pavel Shkleinik
37

Soyez conscient de cela lorsque vous utilisez la réponse de Jon Skeet, avec un code comme celui-ci:

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

Vous obtenez des résultats comme ceux-ci:

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

Le format de l'heure peut afficher au maximum 23 heures. Il n'affiche pas 27 heures ou ne convertit pas les 12 jours en heures, il les coupe simplement comme s'ils n'avaient jamais existé.

Une façon de résoudre ce problème serait de créer une extension qui vérifie la longueur du TimeSpan et crée un formatage basé sur si la période est supérieure à un an, jour, etc. Ou vous pouvez simplement toujours afficher les jours, car ils ne coupent jamais:

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

Notez que je suis un débutant en programmation. Cela ne vient que d'observations après avoir eu la chance de le remarquer après avoir supposé que cela afficherait toutes les heures. Je dis cela parce que je ne sais pas s'il existe une meilleure solution, comme un autre format d'heure qui peut afficher des heures sans fin.

Je pense cependant que ce format fait sa fonctionnalité prévue. Il faut juste en être conscient. Ainsi ce poste. La réponse de Jon Skeet n'a jamais indiqué que ce format consiste à afficher uniquement la propriété hour d'un format de type date où les heures peuvent être au plus 23.

Dimension
la source
14
C'est pourquoi vous avez TotalHoursetc dans TimeSpan. Vous vouliez probablement ceciMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili
17

Si vous avez la malchance de ne pas utiliser .NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);
Holf
la source
9
Pour le code qui doit prendre en charge> 24h, cette solution TotalHoursest toujours la voie à suivre, même dans les nouvelles versions de .net.
CodesInChaos
1
En fait, je trouve cela mieux car vous pouvez simplement lui faire confiance
Chris Marisic du
Méfiez-vous si vous utilisez TotalHours, car c'est un double, pas un intcomme Hoursest, c'est-à-dire qu'il affichera des fractions d'heures ainsi que des heures entières.
Jinlye
6

que diriez-vous de la concacténation:

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

MISE À JOUR 1:

Vous pouvez y échapper avec un guillemet simple: h'h 'm'm 's's'

John Woo
la source
11
Si vous allez utiliser concaténation, vous pourriez aussi bien utiliser Hours, Minutes, Secondspropriétés de l' OMI. Personnellement, je préfère utiliser une chaîne de format personnalisée, après avoir compris la citation.
Jon Skeet
6

Ce petit code aide, pour l'analyse et le retour arrière:

        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;

Référence pour l'analyse de la période

Zamoldar
la source
5

En utilisant Xamarinet .NET Portable 4.5c'était le seul format sur lequel j'ai travaillé après avoir essayé toutes les autres réponses ici:

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

Essentiellement, je mets les :guillemets simples pour leur échapper.

Jonas Stensved
la source
2

Je trouve parfois des chaînes de format un peu comme des expressions rationnelles, en ce sens que lorsque je reviens au code plus tard, j'ai oublié les nuances. Je suis donc allé avec ce qui suit, qui est moins susceptible de me renvoyer la documentation:

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

L'interpolation de chaîne, introduite en C # 6, rend cela beaucoup plus clair qu'il ne le serait autrement.

Giles
la source