2010-03-16 23 views
38

Estoy tratando de formatear un elemento TimeSpan en el formato de "[minutos]: [segundos]". En este formato, 2 minutos y 8 segundos se verían como "02:08". He intentado una variedad de opciones con los métodos String.Format y ToString, pero obtengo una FormatException. Esto es lo que estoy tratando actualmente:C# + Formato TimeSpan

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

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

¿Qué estoy haciendo mal? ¿Cómo formateo un elemento de TimeSpan usando el formato deseado?

Gracias

+0

posible duplicado de [¿Cómo puedo String.Format un objeto TimeSpan con un formato personalizado en .NET?] (Http://stackoverflow.com/questions/574881/how-can-i-string-format-a- timespan-object-with-a-custom-format-in-net) –

Respuesta

41

Prueba esto:

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

oh, publicaste mientras escribía mi respuesta :) – Joel

+4

Esto no es realmente correcto, el separador de tiempo es una cadena sensible a la cultura, disponible en CultureInfo. DateTimeFormat.TimeSeparator. O use el método DateTime.ToString(). –

+1

@nobugz: Gracias por la valiosa información. El OP solicitó explícitamente este formato específico. –

6

Las cadenas de formato de fecha y hora sólo se aplican a DateTime y DateTimeOffset. Puedes utilizar una cadena de formato normal, sin embargo:

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

Tenga en cuenta que el uso de totalminutes aquí asegura que el resultado sigue siendo correcta cuando se tomó más de 60 minutos.

50

NOTA: Esta respuesta se aplica únicamente a .NET 4.0.

El carácter de dos puntos es un literal y necesita ser envuelto entre comillas simples:

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

Desde el MSDN documentation:

la costumbre TimeSpan especificadores de formato no incluyen separador de marcador de posición símbolos , como los símbolos que separan días de horas, horas de minutos o segundos defraccionalsegundos. En su lugar, estos símbolos deben incluirse en el formato personalizado como cadenas literales.

+2

No funciona para mí ... Creo que el problema es el TimeSpan, para un DateTime funciona – tanascius

+0

'TimeSpan' no tiene un método' ToString (string) '. – Joey

+0

@tanascius, @Johannes Rössel: Acabo de notar que la sobrecarga 'ToString (string)' solo existe en .NET4. Las versiones anteriores del marco solo tienen el método simple 'ToString()' que no toma parámetros. – LukeH

2

Prueba esto:

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

Console.WriteLine("[paragraph of information] Total Duration: " + duration.Minutes.ToString("00") + ":" + duration.Seconds.ToString("00")); 
0

siempre se puede hacer:

string.Format("{0}:{1}", duration.Minutes, duration.Seconds); 
+1

Con una cadena de formato vacío que sería un resultado agradable, vacío ;-) – Joey

+0

Sí, buen punto. :) Aún así, no sería difícil solucionarlo. – Joel

+0

@Joel: ¿Y ni siquiera te molestas en editar tu respuesta y corregirla? Wow eres valiente! ;) –

0

Sobre la base de esta página de MSDN que describe el método ToString de TimeSpan, estoy un poco sorprendido de que incluso se puede compilar el código de arriba. TimeSpan no tiene una sobrecarga de ToString() que solo acepta una cadena.

The article también muestra una función que puede coyp y usar para formatear un TimeSpan.

+0

El código se compilará si el OP está utilizando .NET4, pero luego golpeará un tiempo de ejecución 'FormatException' como lo describen. – LukeH

16

Por algún motivo misterioso TimeSpan nunca obtuvo las sobrecargas ToString() que admiten el formateo hasta .NET 4.0. Para versiones anteriores, con tal de que sea positiva, se puede secuestrar DateTime.ToString(): se añadió

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

La sobrecarga 'ToString (string)' para 'TimeSpan' está disponible en .NET4. – LukeH

+1

Código mucho más agradable que la respuesta aceptada. –

0
TimeSpan t = TimeSpan.Parse("13:45:43"); 
Console.WriteLine(@"Timespan is {0}", String.Format(@"{0:yy\:MM\:dd\:hh\:mm\:ss}", t)); 
+0

-1: su código arroja 'FormatException', ya que no existe el concepto de años o meses en un' TimeSpan'. Además, la llamada a 'String.Format' es innecesaria ya que' Console.WriteLine' admite el formato compuesto. [MSDN: formato TimeSpan personalizado] (https://msdn.microsoft.com/en-us/library/ee372287%28v=vs.110%29.aspx). –

11

formato personalizado de System.TimeSpan en.Net 4, por lo que ahora puede hacer lo siguiente:

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

(UPDATE) y aquí hay un ejemplo usando C# 6 cadena de interpolación:

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

En resumen ahora tiene que escapar de la " : "carácter con un" \ "(que a su vez debe ser escapado a menos que esté usando una cadena literal).

Este extracto de la página de MSDN Custom TimeSpan Format Strings explica cómo evitar ":" y "." charecters en una cadena de formato:

la costumbre especificadores de formato TimeSpan no incluyen símbolos de separación de marcador de posición, como los símbolos que días separados de horas, horas de minutos o segundos desde fracciones de segundo. En cambio, estos símbolos se deben incluir en la cadena de formato personalizado como literales de cadena. Por ejemplo, "dd.hh: mm" define un período (.) Como el separador entre días y horas, y dos puntos (:) como el separador entre horas y minutos.

+1

Es difícil encontrar el ejemplo que no usó .ToString() –

0

Puede usar el siguiente código.

TimeSpan tSpan = TimeSpan.FromSeconds(allTotalInMinutes); 
string tTime = string.Format("{1:D2}:{2:D2}", tSpan.Minutes, tSpan.Seconds); 

Mostrará el formato ie 34:45.

Espero que te ayude.