Compartir a través de


MDA de dateTimeInvalidLocalFormat

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.

Output

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

Referencia

DateTimeFormatInfo

Conceptos

Diagnóstico de errores con ayudantes de depuraciones administradas