Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Note
Cet article est spécifique à .NET Framework. Ceci ne s’applique pas aux implémentations plus récentes de .NET, y compris .NET 6 et versions ultérieures.
Le dateTimeInvalidLocalFormat MDA est activé lorsqu’une DateTime instance stockée en tant que temps coordonné universel (UTC) est mise en forme à l’aide d’un format destiné à être utilisé uniquement pour les instances locales DateTime . Ce MDA n’est pas activé pour les instances non spécifiées ou par défaut DateTime .
Symptôme
Une application sérialise manuellement une instance UTC DateTime à l’aide d’un format local :
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));
La cause
Le format « z » pour la DateTime.ToString méthode inclut le décalage de fuseau horaire local, par exemple « +10:00 » pour l’heure de Sydney. Par conséquent, elle produit uniquement un résultat significatif si la valeur de l’objet DateTime est locale. Si la valeur est l’heure UTC, DateTime.ToString inclut le décalage de fuseau horaire local, mais il n’affiche pas ou n’ajuste pas le spécificateur de fuseau horaire.
Résolution
Les instances UTC DateTime doivent être mises en forme de manière à indiquer qu’elles sont UTC. Format recommandé pour les heures UTC afin d’utiliser un « Z » pour indiquer l’heure UTC :
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
Il existe également un format « o » qui sérialise une DateTime utilisation de la Kind propriété qui sérialise correctement, que l’instance soit locale, UTC ou non spécifiée :
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));
Effet sur le runtime
Ce MDA n’affecte pas le runtime.
Sortie
Il n’existe aucune sortie spéciale suite à cet activation MDA. Toutefois, la pile des appels peut être utilisée pour déterminer l’emplacement de l’appel ToString qui a activé le MDA.
Paramétrage
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Exemple
Considérez une application qui sérialise indirectement une valeur UTC DateTime à l’aide de la ou DataSet de la XmlConvert classe, de la manière suivante.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
Par défaut, les XmlConvert sérialisations DataSet utilisent des formats locaux pour la sérialisation. Des options supplémentaires sont nécessaires pour sérialiser d’autres types de DateTime valeurs, tels que UTC.
Pour cet exemple spécifique, passez XmlDateTimeSerializationMode.RoundtripKind à l’appel ToStringXmlConvert. Cela sérialise les données en tant qu’heure UTC.
Si vous utilisez un DataSet, définissez la DateTimeMode propriété sur l’objet DataColumn sur Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);