Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais
Horário de Verão x CompareValidator
Data:8/21/2009

Translate this page now :





Categories: ASP.NET

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :
Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon

Veja Também


O compareValidator do ASP.NET possui vários usos, entre eles validar tipos de dados. Eis que torna-se comum utiliza-lo para validar um campo do tipo data.

A cada ano, porém, temos alguns datas que não são aceitas pelo compareValidator. A data “vilã” este ano é 18/10/2009. Faça o teste : Digite 18/10/2009 em um campo validado pelo compareValidator e receberá como resposta sua mensagem de erro, alertando que trata-se de uma data inválida.

Qual o motivo ? O horário de verão.

Antes de identificarmos claramente o motivo é importante lembrar que toda data é sempre acompanhada de uma hora, mesmo que não visivelmente digitada. Assim sendo, 18/10/2009 significa 18/10/2009 00:00 .

Sabendo isso, considere o fato que nos dias de mudança de horário de verão o relógio é adiantado em 1 hora quando chega a meia noite. Resultado ? Temos um dia de 23 horas, um dia em que toda a hora entre 00 e 01 não existe. Eis o dia 18/10/2009.

Por isso o compareValidator acusa data inválida : Não por causa da data, mas por causa da hora.

Solução 1

A máquina do usuário precisa estar com a validação de horário de verão desabilitada. Não é fácil controlar isso ainda mais em se tratando de um site web.

Assim sendo, a checkbox abaixo tem que ser desmarcada.

SNAG-0006

Solução 2

Não utilizar o comparevalidator. Ao invés de utilizar um compareValidator utilize um customValidator e programe o evento ServerValidate para fazer a validação da data da seguinte forma :

Em VB :

    Protected Sub CustomValidator1_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles CustomValidator1.ServerValidate
        Try
            Date.Parse(args.Value)
            args.IsValid = True
        Catch ex As Exception
            args.IsValid = False
        End Try
    End Sub

 
Em C# :
 
    private void CustomValidator1_ServerValidate(Object source, System.Web.UI.WebControls.ServerValidateEventArgs args)
{
        try
           {
                Date.Parse(args.Value)
                args.IsValid = True
             }
        catch (Exception ex)
            {
                   args.IsValid = False
             }
}

 

Podemos completar o código com uma função em javascript de validação da data, desta forma fazendo o customValidator ter um efeito equivalente ao compareValidator :

    <script language="javascript">
 
        function validar(sender, args) {
            args.IsValid = VerificaData(args.Value);
        }
    
        //#####################
        //# VALIDAÇÃO DA DATA #
        //#####################
        function VerificaData(cData) {
            var data = cData;
            var tam = data.length;
            if (tam != 10) {
                return false;
            }
            var dia = data.substr(0, 2)
            var mes = data.substr(3, 2)
            var ano = data.substr(6, 4)
            if (ano < 1980) {
                return false;
            }
            if (ano > 2010) {
                return false;
            }
 
            switch (mes) {
                case '01':
                    if (dia <= 31)
                        return (true);
                    break;
                case '02':
                    if (dia <= 29)
                        return (true);
                    break;
                case '03':
                    if (dia <= 31)
                        return (true);
                    break;
                case '04':
                    if (dia <= 30)
                        return (true);
                    break;
                case '05':
                    if (dia <= 31)
                        return (true);
                    break;
                case '06':
                    if (dia <= 30)
                        return (true);
                    break;
                case '07':
                    if (dia <= 31)
                        return (true);
                    break;
                case '08':
                    if (dia <= 31)
                        return (true);
                    break;
                case '09':
                    if (dia <= 30)
                        return (true);
                    break;
                case '10':
                    if (dia <= 31)
                        return (true);
                    break;
                case '11':
                    if (dia <= 30)
                        return (true);
                    break;
                case '12':
                    if (dia <= 31)
                        return (true);
                    break;
            }
            {
                return false;
            }
            return true;
        }    
    


Categories: ASP.NET


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 1/10/2015 3:01:00 PM
nome: FzfexiSyogWMcnJhcsw
email: klark2d4@gmail.com
comentário:
J8Z98B http://www.FyLitCl7Pf7kjQdDUOLQOuaxTXbj5iNG.com

data: 11/24/2010 3:06:00 PM
nome: Felipe
email: yahikork@gmail.com
comentário:
Os códigos Não validam ano bisexto

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br