dateTimeInvalidLocalFormat (MDA)

L’Assistant Débogage managé (MDA, Managed Debugging Assistant) dateTimeInvalidLocalFormat est activé quand une instance de DateTime stockée en temps universel (UTC, Universal Coordinated Time) est mise en forme à l’aide d’un format conçu uniquement pour des instances de DateTime locales. Cet Assistant Débogage managé n’est pas activé pour les instances de DateTime par défaut ou non spécifiées.

Symptôme

Une application sérialise manuellement une instance de DateTime en temps universel à l’aide d’un format local :

DateTime myDateTime = DateTime.UtcNow;  
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));  

Cause

Le format « z » pour la méthode DateTime.ToString inclut l’offset de fuseau horaire local, par exemple, « +10:00 » pour l’heure de Sydney. Comme tel, il ne produit un résultat significatif que si DateTime a une valeur locale. S’il s’agit d’une valeur en heure UTC, DateTime.ToString inclut l’offset de fuseau horaire local, mais il n’affiche pas et n’ajuste pas le spécificateur de fuseau horaire.

Résolution

Les instances de DateTime en temps universel doivent être mises en forme d’une façon qui indique qu’elles sont au format UTC. Le format recommandé consiste à utiliser un « Z » pour désigner 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 DateTime en utilisant la propriété Kind, qui effectue une sérialisation correcte qu’il s’agisse d’une instance locale, en temps universel ou non spécifiée :

DateTime myDateTime = DateTime.UtcNow;  
Serialize(myDateTime.ToString("o"));  

Effet sur le runtime

Cet Assistant Débogage managé n’affecte pas le runtime.

Sortie

Il n’y a aucune sortie spéciale résultant de l’activation de cet Assistant Débogage managé. Toutefois, la pile des appels peut être utilisée pour déterminer l’emplacement de l’appel à ToString qui a activé l’Assistant Débogage managé.

Configuration

<mdaConfig>  
  <assistants>  
    <dateTimeInvalidLocalFormat />  
  </assistants>  
</mdaConfig>  

Exemple

Prenons l’exemple d’une application qui sérialise indirectement une valeur DateTime en temps universel en utilisant la classe XmlConvert ou DataSet de la manière suivante.

DateTime myDateTime = DateTime.UtcNow;  
String serialized = XMLConvert.ToString(myDateTime);  

Les sérialisations de XmlConvert et DataSet utilisent par défaut des formats locaux pour la sérialisation. Des options supplémentaires sont nécessaires pour sérialiser d’autres types de valeurs DateTime, tels que le temps universel.

Pour cet exemple précis, passez XmlDateTimeSerializationMode.RoundtripKind à l’appel ToString sur XmlConvert. Les données sont sérialisées en heure UTC.

Si vous utilisez un DataSet, affectez la valeur Utc à la propriété DateTimeMode sur l’objet DataColumn.

DateTime myDateTime = DateTime.UtcNow;  
String serialized = XmlConvert.ToString(myDateTime,
    XmlDateTimeSerializationMode.RoundtripKind);  

Voir aussi