Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Observação
Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
A dateTimeInvalidLocalFormat MDA é ativada quando uma DateTime instância armazenada como Tempo Coordenado Universal (UTC) é formatada usando um formato destinado a ser usado apenas para instâncias locais DateTime . Este MDA não é ativado para instâncias não especificadas ou por defeito DateTime .
Symptom
Uma aplicação está a serializar manualmente uma instância UTC DateTime usando um formato local:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));
Motivo
O formato 'z' do DateTime.ToString método inclui o deslocamento do fuso horário local, por exemplo, "+10:00" para a hora de Sydney. Assim, só produzirá um resultado significativo se o valor de o DateTime for local. Se o valor for hora UTC, DateTime.ToString inclui o deslocamento local do fuso horário, mas não mostra nem ajusta o especificador do fuso horário.
Resolução
As instâncias de UTC DateTime devem ser formatadas de forma a indicar que são UTC. O formato recomendado para os horários UTC é usar um 'Z' para indicar o horário UTC:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
Existe também um formato "o" que serializa o DateTime uso correto da Kind propriedade que serializa corretamente, independentemente de a instância ser local, UTC ou não especificada:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));
Efeito no tempo de execução
Este MDA não afeta o tempo de execução.
Output
Não existe uma saída especial como resultado da ativação deste MDA. No entanto, a pilha de chamadas pode ser usada para determinar a localização da ToString chamada que ativou a MDA.
Configuração
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Exemplo
Considere uma aplicação que está a serializar indiretamente um valor UTC DateTime usando a XmlConvert classe ou DataSet , da seguinte forma.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
As XmlConvert serializações and DataSet utilizam formatos locais para serialização por defeito. São necessárias opções adicionais para serializar outros tipos de DateTime valores, como o UTC.
Para este exemplo específico, passe para XmlDateTimeSerializationMode.RoundtripKind a ToString chamada em XmlConvert. Isto serializa os dados como uma hora UTC.
Se usar um DataSet, defina a DateTimeMode propriedade no DataColumn objeto para Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);