MDA de dateTimeInvalidLocalFormat
Actualización: noviembre 2007
El MDA dateTimeInvalidLocalFormat se activa cuando una instancia de DateTime que está almacenada como hora universal coordinada (UTC) tiene un formato pensado para su uso exclusivo para instancias de DateTime locales. Este MDA no se activa para las instancias de DateTime no especificadas o predeterminadas.
Síntoma
Una aplicación está serializando manualmente una instancia de DateTime UTC utilizando un formato local:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));
Motivo
El formato de 'z' para el método DateTime.ToString incluye el desplazamiento de zona de hora local, por ejemplo, "+10:00" para la hora de Sydney. Como tal, sólo generará un resultado significativo si el valor de DateTime es local. Si el valor es la hora UTC, DateTime.ToString incluye el desplazamiento de zona de hora local, pero no muestra ni ajusta el especificador de la zona horaria.
Resolución
Las instancias de DateTime UTC deberían tener un formato que indique que son del tipo UTC. Formato recomendado para las horas UTC que utilizan un valor de 'Z' para indicar la hora UTC:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
También hay un formato "o" que serializa un DateTime utilizando la propiedad Kind que serializa correctamente independientemente de si la instancia es local, UTC o no está especificada:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));
Efecto en el tiempo de ejecución
Este MDA no afecta al tiempo de ejecución.
Resultados
La activación de MDA no produce ningún resultado especial. Sin embargo, la pila de llamadas se puede utilizar para averiguar la ubicación de la llamada ToString que activó el MDA.
Configuración
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Ejemplo
Considere una aplicación que está serializando indirectamente un valor de DateTime UTC utilizando la clase XmlConvert o DataSet, de la siguiente manera.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
Las serializaciones XmlConvert y DataSet utilizan de forma predeterminada los formatos locales para la serialización. Para serializar otros tipos de valores de DateTime, como UTC, se requieren opciones adicionales.
Para obtener este ejemplo concreto, pase XmlDateTimeSerializationMode.RoundtripKind a la llamada ToString de XmlConvert. Así se serializan los datos como una hora UTC.
Si se está utilizando un DataSet, establezca la propiedad DateTimeMode del objeto DataColumn en Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);
Vea también
Conceptos
Diagnóstico de errores con ayudantes de depuraciones administradas