Étant donné un objet DateTime, comment puis-je obtenir un ISO 8601 date dans un format de chaîne?
Donné:
DateTime.UtcNow
Comment puis-je obtenir une chaîne de caractères qui représente la même valeur dans un ISO 8601format compatible?
Noter que la norme ISO 8601 définit un certain nombre de formats similaires. Le format spécifique, je suis à la recherche est:
yyyy-MM-ddTHH:mm:ssZ
Vous devez vous connecter pour publier un commentaire.
Cela vous donne une date similaire à 2008-09-22T13:57:31.2311892-04:00.
Une autre façon est:
qui vous donne 2008-09-22T14:01:54.9571247 Z
Pour obtenir le format spécifié, vous pouvez utiliser:
DateTime Options De Mise En Forme
ToString("yyyy-MM-ddTHH:mm:ssK")
pour que cela fonctionne (avec jquery timeago plugin que j'utilisais).dt.ToString("s") + dt.ToString("zzz")
// 2013-12-05T07:19:04-08:00"o"
premier.DateTimeOffset
, leToString("o")
format est différent de celuiDateTime
.dateTime.ToString("o")
=> comme ci-dessus, se terminant enZ
.dateTimeOffset.ToString("o")
=> date de fin dans+00:00
. Donc, à venir à partir deDateTimeOffset
vous souhaitez utiliserdateTimeOffset.UtcDateTime.ToString("o");
.DateTime.Now
au lieu deDateTime.UtcNow
. La deuxième option avec le"o"
format est correct et moins sujettes à l'erreur.DateTime.UtcNow.ToString("s", System.Globalization.CultureInfo.InvariantCulture)
vous donner ce que vous cherchez pour le "s" spécificateur de format est décrit comme un sortable date/heure modèle; conforme à la norme ISO 8601.DateTime.UtcNow.ToString(CultureInfo.InvariantCulture.DateTimeFormat.SortableDateTimePattern);
Cependant, depuis toutes ces exclure le fuseau horaire, etc., vous pourriez avoir pas d'autre choix que d'utiliser explicitement formateur, c'est à dire"yyyy-MM-ddTHH:mm:ss.fffZ"
Z
, ressemblant à ceci:DateTime.UtcNow.ToString(c, CultureInfo.InvariantCulture)) => 2012-06-26T11:55:36
et il n'y a pas de milliseconde qui est très agréable d'avoir depuis des ordinateurs fait un certain nombre de ticks par seconde.o
vous obtenez2012-06-26T11:55:36.1007668Z
sens36.1007668
secondes, de sorte que vous obtenez une résolution en bas à1/10^7
de seconde. De ISO8601:2004If a decimal fraction is included, lower order time elements (if any) shall be omitted and the decimal fraction shall be divided from the integer part by the decimal sign [...] the comma (,) or full stop (.)
"s"
n'a pas de sens parce que: “"O" (ou "o"), "R" ou "r", "s", et "u". Ces chaînes correspondent pour les chaînes de format personnalisées définies par l'invariant de la culture. Ils produisent des représentations de chaîne de valeurs de date et heure sont destinés à être identique à travers les cultures.”s
est invariante? À partir de votre lien (saut de chaînes de format), il est dits
utiliseSortableDateTimePattern
, qui stipule que "la propriété définit le culture format de la date des chaînes qui sont...fourni le "s" format standard de la chaîne." De même pourR
.U
etO
d'autre part sont invariantes.sealed
classe. Dans l'énumération de types de chaînes de format,SortableDateTimePattern
n'est pas répertorié comme “Propriétés qui définissent sensible à la culture, chaînes de résultat.” Au lieu de cela, plus bas dans le tableau,"s"
est documenté “pour définir une chaîne de résultat qui est conforme à la norme ISO 8601”. ISO 8601 a pas de localisation des considérations autant que je sache. En espérant juste que la bibliothèque de classe ne fait que la documentation qui lui dit ;-).DateTime.Now.ToString("s", new CultureInfo(myCulture))
.CultureInfo
de l'objet, de même quelque chose qui n'est pasInvariantCulture
, et obtenir les mêmes résultats. I. e., ISO8601 vous obtient la même chaîne, indépendamment de la culture. Ensuite, vous n'avez pas à s'embêter avecInvariantCulture
(?). Mais il ne semble pas à sa place dans une classe où la plupart des autres membres de la doit diffèrent en fonction de la culture."o"
est supérieure."s"
est source de confusion. Définition contre la mise en œuvre? "Le SortableDateTimePattern propriété définit le format spécifique de culture de la date de chaînes de caractères", mais il est mis en œuvre comme une norme définie qui ne change pas par la culture: "Le format de chaîne de caractères retournée par la SortableDateTimePattern propriété reflète une norme définie (ISO 8601) [...] par conséquent, il est toujours le même, quelle que soit la culture." Les citations sont de la documentation, msdn.microsoft.com/en-us/library/...."o"
ou"s"
dépend de votre utilisation et il est intéressant de lire la documentation sur les liens ci-dessus). Mais en bref,"o"
est utile lorsque vous souhaitez conserver laKind
de propriété lors de l'analyse du résultat inverse (d'où l'expression "aller-retour"). Ceci est utile lors de stocker la valeur dans une base de données pour les réutiliser plus tard par exemple.Retourne quelque chose comme 2008-04-10T06:30:00
UtcNow
évidemment retourne un UTC temps, donc il n'y a pas de mal à:a + b
compile du même code intermédiaire commestring.Concat(a, b)
(en supposant que a et b sont des chaînes, bien sûr), donc il n'y a aucune différence dans les performances ou la consommation de mémoire.o
au lieu d'obtenir le fuseau horaire? Accordé, cela comprend les microsecondes comme2014-04-09T09:38:29.7562176-04:00
(à partir deDateTime.Now
) ou2014-04-09T13:38:29.7562176Z
(UtcNow
). Comparer les options de formatstring.Concat
devrait toujours être utilisé de l'intensité de la concaténation de chaîne (en intensif, je veux dire régulièrement utilisés par une application, pas encore, je suis en train de penser le web). @KoenZomersstring.Format
est en fait la façon la plus lente à le faire. Voir à mi-chemin en bas de cette page pour référence: dotnetperls.com/string-concatstring.Concat
obtient un effet sur les performances lors de la concaténation d'au moins 3 chaînes en une seule étape."o"
. Aussi, la différence avec l'aide destring.Concat()
est que vous avez plus de code sur l'écran lorsqu'il n'est pas nécessaire (c'est à dire, vos chaînes ne viennent pas d'unIEnumerable
ou construites dynamiquement un tableau), ce qui rend moins lisible.Utilisation:
De SORTIE
Sources:
Standard de Format de Date et Heure des Chaînes (MSDN)
Personnaliser la Date et l'Heure des Chaînes de Format (MSDN)
string strLocalTimeAndOffset_custom = localTimeAndOffset.ToString("yyyy-MM-ddTHH:mm:ssK");
dansstrLocalTimeAndOffset_custom: 2012-09-17T22:02:51-07:00
=>
Vous pouvez obtenir le "Z" (ISO 8601 UTC) avec le code suivant:
Voici pourquoi:
La norme ISO 8601 avoir quelques différents formats:
DateTimeKind.Local
DateTimeKind.Utc
DateTimeKind.Non spécifié
.NET nous offre un enum avec ces options:
Note: Si vous appliquez le Visuel Studio; 2008 "montre utilitaire" à la toString("o") partie vous pouvez obtenir des résultats différents, je ne sais pas si c'est un bug, mais dans ce cas, vous avez de meilleurs résultats en utilisant une variable de Chaîne si vous êtes le débogage.
Source: Standard de Format de Date et Heure des Chaînes (MSDN)
Si vous devez utiliser DateTime à la norme ISO 8601, puis ToString("o") devrait donner ce que vous cherchez. Par exemple,
Cependant, DateTime + Fuseau horaire peut présenter d'autres problèmes que ceux décrits dans le billet de blog DateTime et DateTimeOffset dans .NET: les Bonnes pratiques et les pièges les plus courants:
Je voudrais juste utiliser
XmlConvert
:Il sera automatiquement préserver le fuseau horaire.
La plupart de ces réponses ont millisecondes /microsecondes qui, clairement, n'est pas pris en charge par l'ISO 8601. La réponse correcte est:
Références:
REMARQUE: en Fonction de la conversion vous êtes en train de faire sur votre fin, vous serez à l'aide de la première ligne (comme la plupart) ou la deuxième.
Assurez-vous d'appliquer le format seulement à l'heure locale, comme "zzz" est les informations de fuseau horaire UTC conversion.
Pour convertir des données DateTime.UtcNow à une représentation de chaîne de aaaa-MM-jjthh:mm:ssZ, vous pouvez utiliser la méthode ToString() de la structure DateTime avec une mise en forme personnalisée de la chaîne. Lorsque vous utilisez les chaînes de format personnalisées avec un DateTime, il est important de se rappeler que vous devez vous échapper de votre séparateurs d'utiliser des guillemets simples.
Le suivant sera le retour de la chaîne de représentation que tu voulais:
– de MSDN
.ToString("s")
?Il est intéressant de noter que la coutume format "aaaa-MM-jjthh:mm:ssK" (sans ms) est le plus rapide de la méthode de mise en forme.
Il est également intéressant de noter que "S" format est lent sur Classique et rapide sur Base...
De numéros de cours sont très proches, entre certaines lignes différence est insignifiante (tests avec le suffixe
_Verify
sont les mêmes que ceux qui sont sans suffixe, montre les résultats de répétabilité)Code:
https://github.com/dotnet/BenchmarkDotNet a été utilisé
Surpris que personne n'a suggéré:
La UniversalSortableDateTimePattern vous obtient presque tout le chemin vers ce que vous voulez (qui est plus un RFC 3339 représentation).
Ajouté:
J'ai décidé d'utiliser les données de référence qui ont été en réponse https://stackoverflow.com/a/43793679/653058 de comparer la façon dont cela fonctionne.
tl:dr; c'est à la très coûteux.
Mise en œuvre:
Résultats:
Si vous êtes en développement en vertu de l' SharePoint 2010 ou plus, vous pouvez utiliser
.ToString("o")
ou, mieux,$"My complicated string {dt:o}"
.De format comme 2018-06-22T13:04:16 qui peut être passé dans l'URI de l'API d'utilisation:
À L'Aide De Newtonsoft.Json, vous pouvez le faire
Exemple: https://dotnetfiddle.net/O2xFSl
Comme mentionné dans d'autres réponses,
DateTime
a des problèmes de conception.NodaTime
Je suggère l'utilisation de NodaTime pour gérer les valeurs de date/heure:
Mise en forme
Afin de créer et formater
ZonedDateTime
vous pouvez utiliser l'extrait de code suivant:Pour moi
NodaTime
code semble assez détaillé. Mais les types sont vraiment utiles. Ils aident à gérer valeurs de date/heure correctement.Newtonsoft.Json