Com certeza você que desenvolve em ASP.NET usou um CompareValidator para validar uma data, certo? Se ainda não, veja como é a sintaxe dele, associada a um TextBox:

CompareValidator acusando inválida uma data VÁLIDA? Que p* é essa?
<asp:TextBox runat="server" id="tbxData" />
<asp:CompareValidator runat="server" id="tbxData_cv" ControlToValidate="tbxData" Operator="DataTypeCheck" Type="Date" Text="*" ErrorMessage="Data Inválida" >

Pois bem: por mais de uma vez, digitando uma data, digamos “18/10/1970” o bicho acusa uma data inválida.

Você pode me perguntar: A sua página está configurada com a cultura correta? Eu digo que sim, meu web.config está certinho nas configurações de globalização e localização, e outras datas funcionam normalmente. E quando a data não é válida o CompareValidator acusa.

Quer um exemplo de uma data, que no caso seria futura no momento que eu escrevo este post, e dá pau? Lá vai: “21/10/2012”.

O que 18/10/1970 e 21/10/2012 tem em comum? Elas são datas de “virada” de horário de verão! Agora vem o pulo do gato: Se testamos as mesmas datas com a configuração de mudança automática de horário de verão desativada, elas são validadas normalmente.

O problema em si está na rotina JavaScript que o ASP.NET gera para validação no cliente. E esse bug já é de ANOS, vem desde da 1ª versão do .NET Framework e ainda NÃO foi corrigido. Isso mesmo, esse maldito bug ainda persiste no .NET Framework 4.0.

E qual a solução? Alguma gambi em mente? Pedir para o usuário do sistema/site desativar o ajuste automático de horário de verão seria demais, visto que nem todos possuem acesso a esta função, principalmente em ambientes corporativos.

A primeira e mais simples é colocar a propriedade EnableClientScript para false. Com isso, a validação é feita chamando a rotina “Validate()” no servidor e checando a propriedade IsValid antes de realizar algum processamento, como salvar em banco de dados. O ruim dessa abordagem é que não poderemos usar o ValidatorCallOutExtender, para dar uma aparência melhor nas mensagens de erro. A validação da data é feita no servidor através do próprio CompareValidator, e esta funciona corretamente.

A segunda é utilizar um CustomValidator, e colocando o seguinte código no evento OnServerValidate:

protected void CustomValidatorData_ServerValidate(object sender, ServerValidateEventArgs e)
{
	DateTime dummy = DateTime.MinValue;
	e.IsValid = DateTime.TryParse(tbxCampoData.Text,out dummy);
}

Enquanto a Microsoft não nos dá uma solução definitiva, vamos nos virando com estas.

Um abraço!