C'est un peu bizarre. L'analyse d'un champ de texte avec un intervalle de temps valide échoue si j'essaie d'être précis!
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);
La deuxième analyse échoue avec une exception "La chaîne d'entrée n'était pas dans un format correct". de DateTime.
De la documentation :
Tout autre caractère non échappé dans une chaîne de format, y compris un caractère d'espace blanc, est interprété comme un spécificateur de format personnalisé. Dans la plupart des cas, la présence de tout autre caractère non échappé entraîne une exception FormatException.
Il existe deux façons d'inclure un caractère littéral dans une chaîne de format:
Mettez-le entre guillemets simples (le délimiteur de chaîne littérale).
Faites-le précéder d'une barre oblique inverse ("\"), qui est interprétée comme un caractère d'échappement. Cela signifie que, en C #, la chaîne de format doit être soit entre guillemets @, soit le caractère littéral doit être précédé d'une barre oblique inverse supplémentaire.
Le .NET Framework ne définit pas de grammaire pour les séparateurs dans les intervalles de temps. Cela signifie que les séparateurs entre jours et heures, heures et minutes, minutes et secondes, et secondes et fractions de seconde doivent tous être traités comme des littéraux de caractères dans une chaîne de format.
Ainsi, la solution consiste à spécifier la chaîne de format comme
TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)
Essaye ça:
var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture);
Si vous ne voulez pas traiter la différence de spécificateurs de format entre TimeSpan.ParseExact
et DateTime.ParseExact
vous pouvez simplement analyser votre chaîne en tant que DateTime
et obtenir le composant TimeOfDay
en tant que TimeSpan
comme ceci:
var t2 = DateTime.ParseExact(tmp, "hh:mm:ss", CultureInfo.InvariantCulture).TimeOfDay;
Il semble que HH ne soit pas vraiment pour TimeSpan
Les spécificateurs de format TimeSpan personnalisés n'incluent pas de symboles de séparation d'espace réservé, tels que les symboles qui séparent les jours des heures, des heures des minutes ou des secondes des fractions de seconde. Au lieu de cela, ces symboles doivent être inclus dans la chaîne de format personnalisé en tant que littéraux de chaîne. Par exemple, "jj.hh \: mm" définit un point (.) Comme séparateur entre les jours et les heures et un deux-points (:) comme séparateur entre les heures et les minutes.
Par conséquent, la bonne façon serait, comme Jon l'a mentionné, de s'échapper en utilisant "\" Lire la suite
Votre TimeSpan
est "17:23:24" qui est au format 24 heures et doit être analysé à l'aide de HH
format et non hh
qui est pour les formats 12 heures.
TimeSpan.ParseExact(tmp, "HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture);
Découvrez les formats
Essaye ça:
var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);