2012-09-22 26 views
9

Estoy intentando formatear un TimeSpan en la cadena. Luego obtengo la caducidad de MSDN para generar mi formato de cadena personalizado. Pero no dice nada. Devuelve "FormatException".TimeSpan ToString "[d.] Hh: mm"

¿Por qué? No entiendo ...

var ts = new TimeSpan(0, 3, 25, 0); 
var myString = ts.ToString("[d'.']hh':'mm"); 

Respuesta

9

Supongo que está tratando de hacer algo como las porciones de día opcional y fracciones de segundo del c standard format. Por lo que puedo decir, esto no es directamente posible con cadenas de formato personalizado. TimeSpan FormatString with optional hours es el mismo tipo de pregunta que usted tiene, y sugeriría algo similar a su solución: tener un método de extensión para construir la cadena de formato para usted.

public static string ToMyFormat(this TimeSpan ts) 
{ 
    string format = ts.Days >= 1 ? "d'.'hh':'mm" : "hh':'mm"; 
    return ts.ToString(format); 
} 

después utilizarla:

var myString = ts.ToMyFormat(); 
+0

Sí, funcionará con seguridad. Pero usaría el formato ToString. MSDN dice que puedo usar "[" y "]". ¿Es verdad? – riofly

+0

¿Dónde dice eso? Las únicas veces que noté '[' y ']' fue cómo describe las cadenas de formato estándar, pero sin decir que realmente puede usar esos símbolos 'mágicos' en formatos personalizados. –

+0

Lo siento, de hecho, estaba equivocado. – riofly

3

Este error generalmente ocurre cuando utiliza símbolos que tienen significados definidos en la cadena de formato. La mejor manera de depurar estos es eliminar caracteres selectivamente hasta que funcione. El último personaje que eliminaste fue el problema.

En este caso, mirando el custom TimeSpan format strings, los corchetes son el problema. Escapar de ellos con "\", por ejemplo:

var ts = new TimeSpan(0, 3, 25, 0); 
var myString = ts.ToString("\\[d'.'\\]hh':'mm"); 

[Editar: Agregado]

No hay manera mencionada en el cliente página de cadenas de formato personalizado TimeSpan omitir texto si los valores son 0. En este caso , considere una instrucción if o el operador ?:.

+0

Sí, sé que los corchetes son el problema. Pero veo que puedo usar "[" y "]" para devolver días solo cuando el valor es> = 0. ¿Es posible? – riofly

+0

@riofly No parece haber ninguna forma de omitir una parte de la cadena si el valor es 0 en http://msdn.microsoft.com/en-us/library/ee372287.aspx. Quizás ah si la declaración es mejor. La respuesta esta actualizada. – akton

Cuestiones relacionadas