Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, tra cui .NET 6 e versioni successive.
L'assistente dateTimeInvalidLocalFormat al debug gestito viene attivato quando un'istanza DateTime archiviata come ora UTC (Universal Coordinated Time) viene formattata usando un formato che deve essere usato solo per le istanze locali DateTime . Questo assistente al debug gestito non è attivato per le istanze predefinite DateTime o non specificate.
Sintomo
Un'applicazione serializza manualmente un'istanza UTC DateTime usando un formato locale:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));
Motivo
Il formato 'z' per il DateTime.ToString metodo include l'offset del fuso orario locale, ad esempio "+10:00" per l'ora di Sydney. Di conseguenza, produrrà un risultato significativo solo se il valore di DateTime è locale. Se il valore è l'ora UTC, DateTime.ToString include l'offset del fuso orario locale, ma non visualizza o regola l'identificatore di fuso orario.
Resolution
Le istanze UTC DateTime devono essere formattate in modo da indicare che sono UTC. Formato consigliato per le ore UTC per l'uso di una "Z" per indicare l'ora UTC:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
Esiste anche un formato "o" che serializza un DateTime uso della Kind proprietà che serializza correttamente indipendentemente dal fatto che l'istanza sia locale, UTC o non specificata:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));
Effetto sul runtime
Questo assistente al debug gestito non influisce sul runtime.
Risultato
Non è disponibile alcun output speciale in seguito all'attivazione dell'assistente al debug gestito. Tuttavia, lo stack di chiamate può essere usato per determinare la posizione della ToString chiamata che ha attivato l'assistente al debug gestito.
Configurazione
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Esempio
Si consideri un'applicazione che serializza indirettamente un valore UTC DateTime usando la XmlConvert classe o DataSet , nel modo seguente.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
Le XmlConvert serializzazioni e DataSet usano i formati locali per la serializzazione per impostazione predefinita. Sono necessarie opzioni aggiuntive per serializzare altri tipi di DateTime valori, ad esempio UTC.
Per questo esempio specifico, passare XmlDateTimeSerializationMode.RoundtripKind alla ToString chiamata su XmlConvert. Serializza i dati come ora UTC.
Se si usa un DataSetoggetto , impostare la DateTimeMode proprietà sull'oggetto DataColumn su Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);