dateTimeInvalidLocalFormat MDA
O dateTimeInvalidLocalFormat MDA é ativado quando uma DateTime que é armazenada como uma hora Universal Coordenada (UTC) é formatado usando um formato que se destina a ser usado somente para o local de instância DateTime instâncias. Este MDA não está ativado por padrão ou não especificado DateTime instâncias.
Sintoma
Um aplicativo manualmente está Serializando um UTC DateTime usando um formato de local da instância:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffzzz"));
Causa
A 'z' formato para o DateTime.ToString método inclui o deslocamento de fuso horário local, por exemplo, "+ 10: 00" para tempo de Sydney. Como tal, ele só produzirá um resultado significativo se o valor de DateTime é local. Se o valor for a hora UTC, DateTime.ToString inclui a hora local deslocamento de zona, mas não é exibida ou ajustar o especificador de fuso horário.
Resolução
UTC DateTime instâncias devem ser formatadas de forma que indica que estão UTC. O formato recomendado para times de UTC para usar a 'Z' para indicar a hora UTC:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffffZ"));
Também é "o" formato serializa um DateTime usar o Kind propriedade serializa corretamente, independentemente da instância local, UTC, ou não especificado:
DateTime myDateTime = DateTime.UtcNow;
Serialize(myDateTime.ToString("o"));
Efeito sobre o tempo de execução.
Este MDA não afeta o tempo de execução.
Saída
Não há nenhuma saída especial como resultado dessa ativando o MDA., no entanto, a pilha de chamada pode ser usada para determinar o local da ToString chamada ativado por que o MDA.
Configuração
<mdaConfig>
<assistants>
<dateTimeInvalidLocalFormat />
</assistants>
</mdaConfig>
Exemplo
Considere um aplicativo que indiretamente está Serializando um UTC DateTime valor usando o XmlConvert ou DataSet classe, de maneira a seguir.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XMLConvert.ToString(myDateTime);
O XmlConvert e DataSet serializations usar formatos locais para serialização por padrão. Opções adicionais são necessários para serializar a outros tipos de DateTime valores, como UTC.
Neste exemplo específico, passe em XmlDateTimeSerializationMode.RoundtripKind para o ToString ligar XmlConvert. Isso serializa os dados como uma hora UTC.
Se usando um DataSet, defina a DateTimeMode propriedade no DataColumn o objeto para Utc.
DateTime myDateTime = DateTime.UtcNow;
String serialized = XmlConvert.ToString(myDateTime,
XmlDateTimeSerializationMode.RoundtripKind);