109 votes

Format TimeSpan ToString

Par curiosité, existe-t-il une chaîne de format que je peux utiliser pour afficher quelque chose comme "5h 3m 30s" ?

eg. (évidemment faux)

myTimeSpan.ToString("hh mm ss")

154voto

Jon Skeet Points 692016

Essayez :

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 dans ma première tentative).

Je suppose que vous utilisez .NET 4, bien sûr - avant cela, TimeSpan ne 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 disponibles via Heure de Noda aussi :)

5 votes

Voir la réponse de Dimension, car celle-ci ne formatera pas correctement les heures de 24 heures ou plus.

0 votes

"dd'd 'hh'h 'mm'm'" - cela fonctionne pour moi. Tenez compte du fait que vous devez entourer votre texte formaté d'apostrophes : "dd 'jours passés'". Ici dd est la paix des données et 'days spent' votre propre texte'.

44voto

Dimension Points 165

Faites attention à 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 horaire peut afficher au maximum 23 heures. Il n'affichera pas 27 heures ou ne convertira pas les 12 jours en heures, il les coupera 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 de l'intervalle de temps et crée un formatage basé sur le fait que l'intervalle de temps est supérieur à une année, un jour, etc. Ou vous pourriez simplement toujours afficher les jours car ils ne sont jamais coupés :

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

Veuillez noter que je suis un débutant en programmation. Ceci est seulement le résultat d'observations après que j'ai eu la chance de le remarquer après avoir supposé qu'il s'afficherait toutes les heures. Je dis cela parce que je ne sais pas s'il y a une meilleure solution, comme un autre format d'heure qui peut afficher des heures sans fin.

Je pense cependant que ce format remplit la fonction pour laquelle il a été conçu. Il faut juste en être conscient. D'où ce post. La réponse de Jon Skeet n'a jamais indiqué que ce format sert à afficher uniquement la propriété "heure" d'un format de type date où les heures peuvent être au maximum de 23.

15 votes

C'est pourquoi vous avez TotalHours etc. dans TimeSpan. Vous vouliez probablement ceci Math.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")

21voto

Holf Points 1952

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

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

11 votes

Pour le code qui doit supporter >24h, cette solution avec TotalHours est toujours la meilleure solution, même dans les versions plus récentes de .net.

1 votes

En fait, je trouve que c'est mieux ainsi, puisque vous pouvez simplement lui faire confiance.

0 votes

Attention si vous utilisez TotalHours car c'est une double et non un int comme Hours est, c'est-à-dire qu'il affichera les fractions d'heures ainsi que les heures entières.

9voto

Jonas Stensved Points 2803

Utilisation de Xamarin y .NET Portable 4.5 C'est le seul format que j'ai réussi à faire fonctionner après avoir essayé toutes les autres réponses ici :

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

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

8voto

zamoldar Points 51

Ce petit exemple de code devrait vous aider à analyser et à inverser l'analyse de TimeSpan :

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 : Chaînes de format TimeSpan personnalisées

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X