56 votes

Comment convertir un TimeSpan ISO8601 en un TimeSpan C# ?

Je reçois un System.FormatException lorsque j'essaie de faire ce qui suit (à titre d'exemple) :

TimeSpan ts = XmlConvert.ToTimeSpan("P72H");

J'ai enquêté sur le Norme ISO8601 et il semble être correct, mais je ne peux pas obtenir l'analyse des heures sans lancer une exception, quoi que je fasse.

Merci !

EDIT :

Détail de l'exception :

System.FormatException was unhandled by user code
HResult=-2146233033
Message=The string 'P72H' is not a valid TimeSpan value.
Source=System.Xml

0 votes

@Oded Il ne s'agit pas d'une question sur le formatage des chaînes de caractères dans .NET.

0 votes

Pour être clair, je n'obtiens pas d'exception à cause d'une incompatibilité de type, mais à cause de l'erreur d'identification de l'utilisateur. XmlConvert.ToTimeSpan méthode. Il s'agit d'une question sur la conversion d'une chaîne de durée standard ISO8601 en un format utilisable en C#.

0 votes

@Magnus P72H signifie une durée de 72 heures

93voto

pstrjds Points 6353

Vous devez ajouter le séparateur de temps à votre chaîne. Essayez ceci :

TimeSpan ts = XmlConvert.ToTimeSpan("PT72H");

Voir la spécification de la durée - http://www.w3.org/TR/xmlschema-2/#duration

3.2.6.1 Représentation lexicale
La représentation lexicale de la durée est le format étendu [ISO 8601] PnYn MnDTnH nMnS, où nY représente le nombre d'années, nM le nombre de mois, nD le nombre de jours, "T" est le séparateur date/heure, nH le nombre d'heures, nM le nombre de minutes et nS le nombre de secondes. Le nombre de secondes peut inclure des chiffres décimaux avec une précision arbitraire.

Modifier/mettre à jour en fonction des commentaires

Comme on se demandait pourquoi la ficelle P2M2W5D ne serait pas considéré comme un TimeSpan depuis W fait partie de la norme ISO 8601, je voulais ajouter cette mise à jour pour que si quelqu'un rencontre ce problème, il n'ait pas à lire les commentaires pour obtenir la réponse. Le problème, à la fois pour la chaîne originale en question P72H y P2M2W5D est que la chaîne de caractères doit être conforme au schéma XML du W3C (voir la documentation de l'outil XmlConvert.ToTimeSpan (en anglais) ). Lorsque nous regardons le schéma XML du W3C (lien ci-dessus), il renvoie à la norme ISO 8601, et en particulier à la section 5.5.3.2.1 qui donne la raison pour laquelle W n'est pas un caractère valide dans le schéma XML :

Puisque les semaines n'ont pas de point de report défini (52 ou ne doivent pas être utilisées dans ces applications

14voto

millimoose Points 22665

Vous avez dû manquer quelque chose dans la norme. La suivante :

System.Xml.XmlConvert.ToString(TimeSpan.FromHours(12))

me donne la chaîne PT12H . Il semble donc que la partie temps doive être préfixée par un T . Et ce qui suit est analysé correctement :

System.Xml.XmlConvert.ToTimeSpan("PT25H")

(Pour un TimeSpan qui se transforme en 1.01:00:00 .)

6voto

Ravikumar B Points 39

Veuillez utiliser le format suivant pour System.Xml.XmlConvert.ToTimeSpan("PnYnMnDTnHnMnS") .

P - L'indicatif doit être placé avant le format de la date.

nY - Nombre d'années, ex : 2Y
nM - Nombre de mois ex : 4M
nD - Nombre de jours ex : 6D

T - L'indicatif qui doit être placé avant le format horaire

nH - Nombre d'heures ex : 8H
nM - Nombre de minutes ex : 12M
nS - Nombre de secondes ex : 14S

    System.Xml.XmlConvert.ToTimeSpan("P2Y4M6DT8H12M14S")

Ici, la confusion vient du fait que le mois et les minutes ont la même lettre pour les désigner, mais l'utilisation de l'indicatif les rend distincts et faciles à comprendre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X