J'ai trouvé comment transformer un DateTime en un format ISO 8601 , mais rien sur la façon de faire l'inverse en C #.
J'ai 2010-08-20T15:00:00Z
, et je veux en faire un DateTime
objet.
Je pourrais séparer les parties de la corde moi-même, mais cela semble être beaucoup de travail pour quelque chose qui est déjà une norme internationale.
Réponses:
Cette solution utilise l' énumération DateTimeStyles et fonctionne également avec Z.
Cela imprime parfaitement la solution.
la source
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);
semble fonctionner correctement.DateTimeStyles.RoundtripKind?
description MSDN est vide.2018-06-19T14:56:14.123Z
est analysé en tant qu'heure locale et non UTC. J'utiliseCultureInfo.InvariantCulture
au lieu de null.DateTimeStyles.RoundTripKind
, voir stackoverflow.com/q/39572395/2014893Bien que MSDN dise que les formats «s» et «o» reflètent la norme, ils semblent pouvoir en analyser seulement un sous-ensemble limité. En particulier, cela pose un problème si la chaîne contient une spécification de fuseau horaire. (Ni pour les formats de base ISO8601, ni pour les formats à précision réduite - mais ce n'est pas exactement votre cas.) C'est pourquoi j'utilise des chaînes de format personnalisées lorsqu'il s'agit d'analyser ISO8601. Actuellement, mon extrait préféré est:
Si cela ne vous dérange pas d'analyser les chaînes sans TZ (je le fais), vous pouvez ajouter une ligne «s» pour étendre considérablement le nombre de modifications de format couvertes.
la source
"yyyyMMdd"
dans leformats
tableau une précision réduite à quelques jours, car c'est parfois le cas lorsqu'un RRULE RFC 5545 s'appuiera sur un DTSTART pour fournir l'heure.K
vous permet de regrouper vos différentes manipulations de fuseaux horaires. J'ai une variante plus étendue sur stackoverflow.com/a/31246449/400547 mais c'est trop complet (accepte des éléments valides ISO 8601 mais non utilisés dans les profils plus courants) mais cela montre commentK
réduire la taille d'un troisième.la source
En voici un qui fonctionne mieux pour moi ( version LINQPad ):
produit
la source
Il semble important de faire correspondre exactement le format de la chaîne ISO pour
TryParseExact
fonctionner. Je suppose qu'exact est exact et cette réponse est évidente pour la plupart, mais de toute façon ...Dans mon cas, la réponse de Reb.Cabin ne fonctionne pas car j'ai une entrée légèrement différente selon ma "valeur" ci-dessous.
Valeur:
2012-08-10T14:00:00.000Z
Il y a quelques milliers supplémentaires là-dedans pendant des millisecondes et il peut y en avoir plus.
Cependant, si j'en ajoute
.fff
au format comme indiqué ci-dessous, tout va bien.Chaîne de format:
@"yyyy-MM-dd\THH:mm:ss.fff\Z"
Dans la fenêtre immédiate de VS2010:
vrai
Vous devrez peut-être également l'utiliser
DateTimeStyles.AssumeLocal
en fonction du fuseau horaire de votre heure ...la source
AssumeUniversal
àAdjustToUniversal
.Cela fonctionne très bien dans LINQPad4:
la source
DateTime.ParseExact(...)
vous permet d'indiquer à l'analyseur ce que chaque caractère représente.la source