1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Solução Validação de datas em c# [Expressão regular]

Discussão em 'Programação' iniciada por alfinete, 29 de Janeiro de 2009. (Respostas: 7; Visualizações: 23941)

  1. alfinete

    alfinete Power Member

    Como validar uma data c#
    Código:
    #region [valida datas]
    
                        /*************Datas**********/
                        /*validacao de comparação entre duas datas ,
                         * datai - datainicial, 
                         * dataf - datafinal, 
                         * label - label erro da data final*/
                        public bool [COLOR=Orange][B]comparadatas[/B][/COLOR](DateTime datai, DateTime dataf, System.Web.UI.WebControls.Label label)
                        {
                          bool res = false;
                          if (dataf >= datai)
                          {
                            res = true;
                            label.Text = "<span class=\"erroverdade\">*</span> ";
                          }
                          else
                          {
                            res = false;
                            label.Text = "<span class=\"errofalso\">*</span> ";
                          }
                          return res;
                        } 
    
                        /*Validação geral d um campo data  */
                        /* data - string da data inserida na textbox
                         * dataminima - string da data minima que pode ser inserida
                         * label - id da labelde erro referente a um determinado campo */
                        public bool [B][COLOR=Orange]VDatas[/COLOR][/B](string data, string dataminima, System.Web.UI.WebControls.Label label)
                        {
    
                          bool resul = false;
    
                          // testa para caixa de data decisão vazia
                          if (data == "")
                          {
                            label.Text = "<span class=\"errofalso\">*</span> ";
    
                            resul = false;
                          }
                          // valida campo diferente de vazio
                          if (data != "")
                          {
                            //valida para campo com 10 caracteres e campo com tim e 10 caracteres
                            if ((data.Length == 10) || (data.Length == 10))// testa p numero de caracteres
                            {
                              // testa se e data valida
                              if (validaData(data))
                              {
                                string datamin = dataminima;
                                string strdatamin = datamin.Substring(6, 4) + "-" + datamin.Substring(3, 2) + "-" + datamin.Substring(0, 2);
                                DateTime datageral2 = Convert.ToDateTime(strdatamin);
    
                                string str = data.Substring(6, 4) + "-" + data.Substring(3, 2) + "-" + data.Substring(0, 2);
                                DateTime datageral = Convert.ToDateTime(str);
    
                                //testa se é menor ou igual que  a data actual
                                if (datageral <= datageral2)
                                {
                                  label.Text = "<span class=\"errofalso\">*</span>";
                                  resul = false;
                                }
                                //testa se é maior que a data actual
                                if (datageral > datageral2)
                                {
                                  label.Text = "<span class=\"erroverdade\">*</span>";
                                  resul = true;
                                }
    
                              }
                              else
                              {
                                label.Text = "<span class=\"errofalso\">*</span>";
    
                                resul = false;
                              }
                            }
                            else
                            {
                              label.Text = "<span class=\"errofalso\">*</span>";
    
                              resul = false;
    
                            }
    
                          }
                          return resul;
                        }
    
                        //valida data no ambito da sua formatação
                        private bool [B][COLOR=Orange]validaData[/COLOR][/B](string str)
                        {
    
                          Regex Data = new Regex(@"^((((0?[1-9]|[12]\d|3[01])[\-](0?[13578]|1[02])[\-]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\-](0?[13456789]|1[012])[\-]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\-]0?2[\-]((1[6-9]|[2-9]\d)?\d{2}))|(29[\-]0?2[\-]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$");
                          return Data.IsMatch(str);
    
                        }
    
    
    
    
                #endregion
     
    conjunto de metodos em c# desenvolvidos por mim , excepto a exp regular

    validaData() , verifica tb se ano é bisexto ou n , recebe uma string data e verifica se a mesma é valida em ralaç
    ão a uma especificação, penso que esta formatada para dd-mm-aaaa, sempre a podes alterar
    devolvendo true caso seja valida e false caso contrario


    comparadatas(), compara se uma data é maior que outra devolvendo true caso verdade e false caso falso ....


    VDatas() tb devolve true ou false caso seja verdadeiro ou falso.

    esta faz tdas as verificações possiveis (pode faltar uma ou outra mas são suficientes),

    • se o campo de data vazio ou não ,
    • verifica o tamanho da string da data,
    • se data valida "validaData()",
    • verifica se a data a tua data em relação a actual.
    se não me engano esta espressão regular da ate ano 2040 e tal (salvo erro)
     
    Última edição pelo moderador: 30 de Janeiro de 2009
  2. _freelancer_

    _freelancer_ Power Member

    Código:
    public bool validaData(string sData) {
         try {
             DateTime.Parse(sData);
             return true;
         } catch {
             return false;
         }
    }
    
    Mais simples e sem usar regex. :)
     
  3. alfinete

    alfinete Power Member

    sim mas supoe que ao pores uma ata na txtbox queres validar se essa mesma data esta no formato

    dd-mm-aaa ou dd/mm/aaa ou dd.nn.aaa , e por ai fora a expressão regular serve para isso mesmo
     
  4. MeY-ZiNG

    MeY-ZiNG Power Member

    Para isso tens o DateTime.ParseExact (ou TryParseExact) que recebe num dos argumentos uma string a indicar o formato em que se encontra a data... se aceitas vários formatos distintos, podes ter uma lista de strings com formatos e iteras sobre essa lista, chamando o método TryParseExact em cada iteração...

    ... ou então usas uma expressão regular que suporte os casos todos, mas aí podem escapar-te alguns casos...
     
  5. Feiticeiro

    Feiticeiro Power Member

    Separas o ano, mês e dia. Colocas num try catch e convertes para a data no formato que pretendes. Devolve true se correcta, false se não.
     
  6. alfinete

    alfinete Power Member

    mas nesse caso ficas com mais code


    ai so tens uma linha com a expressão regular se da true é verdadeira se e false da falsa

    as restantes verificações so tem a ver com datas minimas e maximas, tamanho da data etc

    por isso a da expressão regular fica com menos code

    mas ambas as abordagens estão bem
     
  7. Boas,

    Foi me dado um pequeno projecto em C# em que teria que criar um programa que validasse Nif's, para isso usei uma TextBox e um Button, mas além de criar esse programa a validação seria feita através de Web References, minha pergunta é como que faço isto? Tenho alguma experiência, mas ainda não sei tudo... se pudessem me ajudar...

    Desde já agradeço
     
  8. Kemosabe-TBC

    Kemosabe-TBC Power Member

    Estás-te a preocupar em ter mais meia dúzia de linhas de código? Isso é completamente irrelevante. Ainda para mais quando ESSA linha de código é mais difícil de manter e extremamente propícia a erros, e a alternativa te garante que isso funciona em todos os casos... Conclusão, livra-te da expressão regular, a não ser que ela te permita fazer algo que não seja possível fazer doutra forma.

    Qual é que é o problema em ter mais linhas de código de qualquer forma. Performance? Legibilidade?
    Performance não só é irrelevante, como a maior parte das soluções mais eficientes requerem algoritmos com mais linhas de código (neste caso nem se aplica nenhuma questão de performance portanto não interessa discutirmos isso).
    Se o problema for legibilidade e clareza de código, posso-te garantir que essa linha de código é 100x menos legível do que a alternativa com mais linhas de código.
     
    Última edição: 8 de Outubro de 2010

Partilhar esta Página