Condividi tramite


dateTimeInvalidLocalFormat (MDA)

L'assistente al debug gestito dateTimeInvalidLocalFormat viene attivato quando per un'istanza di DateTime archiviata in formato UTC (Universal Coordinated Time) viene utilizzato un formato riservato alle istanze locali di DateTime. Questo assistente non viene attivato per le istanze di DateTime non specificate o predefinite.

Sintomi

Un'applicazione sta serializzando manualmente un'istanza di DateTime in formato UTC utilizzando un formato locale:

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

Causa

Il formato 'z' del metodo DateTime.ToString include l'offset del fuso orario locale, ad esempio "+10:00" per l'ora di Sydney. Di conseguenza, verrà generato un risultato significativo solo se il valore di DateTime è locale. Se il valore è in formato UTC, DateTime.ToString include l'offset del fuso orario locale, ma non visualizza né modifica l'identificatore del fuso orario.

Risoluzione

Le istanze di DateTime in formato UTC devono essere formattate in modo che vengano identificate come UTC. Per indicare un'ora in formato UTC si consiglia di utilizzare una 'Z':

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

Esiste inoltre un formato "o" che serializza un'istanza di DateTime utilizzando la proprietà Kind, che viene serializzata correttamente indipendentemente dal fatto che l'istanza sia in formato locale, UTC o non specificato:

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

Effetti su Common Language Runtime

Questo assistente al debug gestito non ha alcun effetto su Common Language Runtime.

Output

L'attivazione di questo assistente al debug gestito non genera alcun output specifico. È possibile, tuttavia, utilizzare lo stack di chiamate per determinare la posizione della chiamata ToString che ha attivato l'assistente.

Configurazione

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

Esempio

Si supponga ad esempio un'applicazione che sta serializzando indirettamente un valore DateTime UTC utilizzando la classe XmlConvert o DataSet, come descritto di seguito.

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

Per impostazione predefinita, XmlConvert e DataSet utilizzano formati locali per la serializzazione. Per serializzare altri tipi di valori DateTime, ad esempio UTC, sono necessarie opzioni aggiuntive.

Per questo esempio specifico, passare XmlDateTimeSerializationMode.RoundtripKind alla chiamata ToString su XmlConvert. In questo modo i dati vengono serializzati come ora UTC.

Se si utilizza DataSet, impostare la proprietà DateTimeMode nell'oggetto DataColumn su Utc.

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

Vedere anche

Riferimenti

DateTimeFormatInfo

Concetti

Diagnostica degli errori tramite gli assistenti al debug gestito