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);
Prueba esto:
var t2 = TimeSpan.ParseExact(tmp, "c", 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;