web-dev-qa-db-fra.com

Comment convertir un TimeSpan ISO8601 en 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 étudié le Norme ISO8601 et il semble être correct, mais je ne peux pas le faire analyser les heures sans lever d'exception, quoi que je fasse.

Merci!

ÉDITER:

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
42
Codeman

Vous devez ajouter le séparateur d'heure à votre chaîne. Essaye ça:

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

Voir la spécification de 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 la date/heure séparateur, 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.

Édition/mise à jour basée sur les commentaires

Comme la question de savoir pourquoi la chaîne P2M2W5D ne serait pas considéré comme un TimeSpan valide puisque W fait partie de la norme ISO 8601, je voulais ajouter cette mise à jour afin que si quelqu'un rencontre ce problème, il n'ait pas à lire à travers les commentaires pour obtenir la réponse. Le problème, à la fois pour la chaîne d'origine en question P72H et P2M2W5D est que la chaîne doit être conforme au schéma XML du W3C (voir la documentation pour XmlConvert.ToTimeSpan ). 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:

Comme les semaines n'ont pas de point de transfert défini (52 ou 53), les semaines ne doivent pas être utilisées dans ces applications

68
pstrjds

Vous devez avoir manqué quelque chose dans la norme. Le suivant:

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

me donne la chaîne PT12H. Il semble donc que la portion de temps doit être préfixée par un T. Et les analyses suivantes sont correctes:

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

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

10
millimoose

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

P - L'indicateur 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'indicateur qui doit être placé avant le format d'heure

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

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

Ici, la partie confusion avec Mois et Minutes a la même lettre à désigner, mais l'utilisation de l'indicateur les sépare pour les comprendre facilement.

2
Ravikumar B