Partilhar via


dateTimeInvalidLocalFormat MDA

Nota

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.

O dateTimeInvalidLocalFormat MDA é ativado quando uma DateTime instância armazenada como um Tempo Universal Coordenado (UTC) é formatada usando um formato que se destina a ser usado apenas para instâncias locais DateTime . Este MDA não está 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 método inclui o deslocamento de fuso horário local, por exemplo, "+10:00" para o DateTime.ToString horário de Sydney. Como tal, só produzirá um resultado significativo se o valor do DateTime for local. Se o valor for hora UTC, DateTime.ToString inclui o deslocamento de fuso horário local, mas não exibe nem ajusta o especificador de fuso horário.

Resolução

DateTime As instâncias UTC devem ser formatadas de forma a indicar que são UTC. O formato recomendado para as horas UTC para usar um 'Z' para indicar 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 fazendo 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 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 ativação do MDA., No entanto, a pilha de chamadas pode ser usada para determinar o ToString local da 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 XmlConvert classe ou DataSet da seguinte maneira.

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

As XmlConvert serializações e DataSet 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 DateTimeModeDataColumn propriedade no objeto como Utc.

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

Consulte também