Comparteix a través de


MDA dateTimeInvalidLocalFormat

Nota:

Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.

El dateTimeInvalidLocalFormat MDA se activa cuando una DateTime instancia que se almacena como una hora coordinada universal (UTC) tiene formato con un formato que está pensado para usarse solo para instancias locales DateTime . Este MDA no está activado para instancias no especificadas o predeterminadas DateTime .

Síntoma

Una aplicación serializa manualmente una instancia UTC DateTime mediante un formato local:

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

Causa

El formato "z" del DateTime.ToString método incluye el desplazamiento de zona horaria local, por ejemplo, "+10:00" para la hora de Sídney. Por lo tanto, solo generará un resultado significativo si el valor de DateTime es local. Si el valor es hora UTC, DateTime.ToString incluye el desplazamiento de zona horaria local, pero no muestra ni ajusta el especificador de zona horaria.

Resolution

Las instancias UTC DateTime deben tener formato de manera que indique que son UTC. El formato recomendado para las horas UTC para usar una "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 uso de la Kind propiedad que serializa correctamente, independientemente de si la instancia es local, UTC o no 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.

Salida

No hay ninguna salida especial como resultado de la activación de este MDA. Sin embargo, la pila de llamadas se puede usar para determinar la ubicación de la ToString llamada que activó el MDA.

Configuración

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

Ejemplo

Considere una aplicación que serializa indirectamente un valor UTC DateTime mediante la XmlConvert clase o DataSet , de la siguiente manera.

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

Las XmlConvert serializaciones y DataSet usan formatos locales para la serialización de forma predeterminada. Se requieren opciones adicionales para serializar otros tipos de DateTime valores, como UTC.

Para este ejemplo específico, pase XmlDateTimeSerializationMode.RoundtripKind a la ToString llamada en XmlConvert. Esto serializa los datos como una hora UTC.

Si usa un DataSet, establezca la DateTimeMode propiedad en el DataColumn objeto Utcen .

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

Consulte también