web-dev-qa-db-fra.com

Pourquoi TimeSpan.ParseExact ne fonctionne pas

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.

39
Quango

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)
80
Jon

Essaye ça:

var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture);

Source: chaînes de format TimeSpan standard

8
M. Mennan Kara

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;
4
samgak

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

2
V4Vendetta

Essaye ça:

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