c# parsing timespan

c# - Por qué TimeSpan.ParseExact no funciona



timespan c# (5)

De la documentation :

Cualquier otro carácter no escapado en una cadena de formato, incluido un carácter de espacio en blanco, se interpreta como un especificador de formato personalizado. En la mayoría de los casos, la presencia de cualquier otro carácter no escapado da como resultado una FormatException.

Hay dos formas de incluir un carácter literal en una cadena de formato:

  • Colóquelo entre comillas simples (el delimitador de cadena literal).

  • Preceda con una barra invertida ("/"), que se interpreta como un carácter de escape. Esto significa que, en C #, la cadena de formato debe ser @-cotizada, o el carácter literal debe estar precedido por una barra invertida adicional.

.NET Framework no define una gramática para separadores en intervalos de tiempo. Esto significa que los separadores entre días y horas, horas y minutos, minutos y segundos, y segundos y fracciones de segundo deben ser tratados como literales de caracteres en una cadena de formato.

Entonces, la solución es especificar la cadena de formato como

TimeSpan.ParseExact(tmp, "hh//:mm//:ss", CultureInfo.InvariantCulture)

Esto es un poco extraño. El análisis de un campo de texto con un intervalo de tiempo válido falla si trato de ser preciso.

const string tmp = "17:23:24"; //works var t1 = TimeSpan.Parse(tmp); //fails var t2 = TimeSpan.ParseExact(tmp, "hh:mm:ss", System.Globalization.CultureInfo.InvariantCulture);

El segundo análisis falla con una excepción "La cadena de entrada no estaba en el formato correcto". desde DateTime.


Parece que HH no es realmente para TimeSpan

Los especificadores de formato TimeSpan personalizados no incluyen símbolos separadores de marcador de posición, como los símbolos que separan días de horas, horas de minutos o segundos de segundos fraccionarios. 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 punto (.) Como separador entre días y horas, y dos puntos (:) como separador entre horas y minutos.

Por lo tanto, la forma correcta sería como Jon mencionó para escapar usando "/" documentation

Su TimeSpan es "17:23:24", que está en el formato de 24 horas y debe analizarse utilizando HH formato HH y no hh que es para formatos de 12 horas.

TimeSpan.ParseExact(tmp, "HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture);

Mira los formatos


Prueba esto:

var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);



Si no quiere lidiar con la diferencia en los especificadores de formato entre TimeSpan.ParseExact y DateTime.ParseExact , puede analizar su cadena como DateTime y obtener el componente TimeOfDay como un TimeSpan como este:

var t2 = DateTime.ParseExact(tmp, "hh:mm:ss", CultureInfo.InvariantCulture).TimeOfDay;