57 votes

C# + Format TimeSpan

J'essaie de formater un élément TimeSpan au format "[minutes] :[secondes]". Dans ce format, 2 minutes et 8 secondes ressembleraient à "02:08". J'ai essayé diverses options avec String.Format et les méthodes ToString, mais j'obtiens une FormatException. Voici ce que j'essaie actuellement :

DateTime startTime = DateTime.Now;
// Do Stuff
TimeSpan duration = DateTime.Now.Subtract(startTime);

Console.WriteLine("[paragraph of information] Total Duration: " + duration.ToString("mm:ss"));

Que dois-je faire de mal ? Comment puis-je formater un élément TimeSpan au format souhaité ?

83voto

LukeH Points 110965

REMARQUE : cette réponse s'applique uniquement à .NET 4.0.

Le caractère deux-points est un caractère littéral et doit être entouré de guillemets simples :

duration.ToString("mm':'ss")

De la Documentation MSDN :

La coutume TimeSpan spécificateurs de format ne comprennent pas de symboles de séparation tels que les symboles qui séparent les jours des heures, les heures des minutes, ou les secondes des fractions de fractions de seconde. En revanche, ces symboles doivent être inclus dans le format personnalisé personnalisée en tant que chaînes littérales.

2 votes

Cela ne fonctionne pas pour moi ... Je pense que le problème est le TimeSpan, pour une DateTime cela fonctionne.

0 votes

TimeSpan n'a pas de ToString(string) méthode.

0 votes

@tanascius, @Johannes Rössel : Je viens de remarquer que le ToString(string) n'existe que dans .NET4. Les versions antérieures du framework ne disposent que de la surcharge ToString() qui ne prend pas de paramètres.

58voto

Ahmed Abdelkader Points 1300

Essayez ça :

Console.WriteLine("{0:D2}:{1:D2}", duration.Minutes, duration.Seconds);

0 votes

Oh, vous avez posté pendant que j'écrivais ma réponse :)

4 votes

Ce n'est pas vraiment correct, le séparateur de temps est une chaîne sensible à la culture, disponible dans CultureInfo.DateTimeFormat.TimeSeparator. Vous pouvez également utiliser la méthode DateTime.ToString().

1 votes

@nobugz : Merci pour ces informations précieuses. Le PO a explicitement demandé ce format spécifique.

24voto

Doctor Jones Points 11502

Le formatage personnalisé de System.TimeSpan a été ajouté dans .Net 4, de sorte que vous pouvez maintenant faire ce qui suit :

string.Format("{0:mm\\:ss}", myTimeSpan);

(MISE À JOUR) et voici un exemple utilisant l'interpolation de chaînes de caractères en C# 6 :

$"{myTimeSpan:hh\\:mm\\:ss}"; //example output 15:36:15

En bref, vous devez maintenant échapper au caractère " :" par un "\" (qui doit lui-même être échappé à moins que vous n'utilisiez une chaîne verbatim).

Cet extrait du MSDN Chaînes de format TimeSpan personnalisées explique comment échapper les caractères " :" et "." dans une chaîne de format :

Les spécificateurs de format TimeSpan personnalisés n'incluent pas de symboles de séparation de type placeholder, tels que les symboles qui séparent les jours des heures, les heures des minutes ou les secondes des fractions de secondes. Au lieu de cela, ces symboles doivent être inclus dans la chaîne de format personnalisée en tant que chaînes littérales. Par exemple, "dd.hh:mm" définit un point (.) comme séparateur entre les jours et les heures, et deux points ( :) comme séparateur entre les heures et les minutes.

2 votes

Difficile de trouver l'exemple qui n'a pas utilisé .ToString()

20voto

Hans Passant Points 475940

Pour une raison mystérieuse, TimeSpan n'a jamais obtenu les surcharges ToString() qui prennent en charge le formatage avant .NET 4.0. Pour les versions antérieures, tant qu'il est positif, vous pouvez détourner DateTime.ToString() :

TimeSpan ts = new TimeSpan(0, 2, 8);
string s = new DateTime(ts.Ticks).ToString("mm:ss");

6voto

Joey Points 148544

Les chaînes de format de date et d'heure s'appliquent uniquement à DateTime et DateTimeOffset. Vous pouvez toutefois utiliser une chaîne de format normale :

string.Format("{0}:{1:00}", Math.Truncate(duration.TotalMinutes), duration.Seconds)

Notez que l'utilisation de TotalMinutes ici permet de s'assurer que le résultat est toujours correct lorsqu'il a fallu plus de 60 minutes.

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