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

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:
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
 
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

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...
 
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
 
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
 
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

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:
Back
Topo