Condividi tramite


dateTimeInvalidLocalFormat (MDA)

Nota

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, incluse .NET 6 e versioni successive.

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

Sintomo

Un'applicazione sta serializzando manualmente un'istanza di DateTime in formato UTC usando 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 è consigliabile usare una 'Z':

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

Esiste anche un formato "o" che serializza un'istanza di DateTime usando 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"));

Effetto sull'ambiente di esecuzione

Questo assistente al debug gestito non ha alcun effetto sul runtime.

Output

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

Impostazione

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

Esempio

Si consideri ad esempio un'applicazione che stia serializzando indirettamente un valore DateTime UTC tramite la classe XmlConvert o DataSet, come descritto di seguito.

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

Per impostazione predefinita, XmlConvert e DataSet usano 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 usa DataSet, impostare la proprietà DateTimeMode dell'oggetto DataColumn su Utc.

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

Vedi anche