Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Este artigo é específico para .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.
O dateTimeInvalidLocalFormat MDA é ativado quando uma DateTime instância armazenada como UTC (Tempo Coordenado Universal) é formatada usando um formato que se destina a ser usado apenas para instâncias locais DateTime . Esse MDA não é ativado para instâncias não especificadas ou padrão DateTime .
Sintoma
Um aplicativo está serializando 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' para o DateTime.ToString método inclui o deslocamento de fuso horário local, por exemplo, "+10:00" para o horário de Sydney. Dessa forma, ele só produzirá um resultado significativo se o valor do DateTime local for local. Se o valor for hora UTC, DateTime.ToString incluirá o deslocamento de fuso horário local, mas ele não exibirá ou ajustará o especificador de fuso horário.
Resolução
As instâncias UTC DateTime devem ser formatadas de uma maneira que indique que elas são UTC. O formato recomendado para horários UTC para usar um 'Z' para denotar a hora UTC:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
Há também um formato "o" que serializa um DateTime uso 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 Runtime
Esse MDA não afeta o runtime.
Saída
Não há saída especial como resultado dessa ativação do MDA., no entanto, a pilha de chamadas pode ser usada para determinar o local da ToString chamada que ativou o MDA.
Configuração
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Exemplo
Considere um aplicativo que está serializando indiretamente um valor UTC DateTime usando a classe ou DataSet a XmlConvert classe da maneira a seguir.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
As XmlConvert serializações e as DataSet serializações usam formatos locais para serialização por padrão. Opções adicionais são necessárias para serializar outros tipos de DateTime valores, como UTC.
Para este exemplo específico, passe XmlDateTimeSerializationMode.RoundtripKind para a ToString chamada.XmlConvert Isso serializa os dados como uma hora UTC.
Se estiver usando um DataSet, defina a DateTimeMode propriedade no DataColumn objeto como Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);