Resolvido - verificar se é uma data valida

11 respostas
G

olá
ajuda na hora de converte

function DataOk(Dt:String):Boolean; stdcall;
var Dia,Mes:Byte;
    Ano:Integer;
function AnoBissesto(Year :Integer): boolean ;
begin
  AnoBissesto:=(ano mod 4=0) and ( ano mod 100 <> 0) or (ano Mod 400 =0);
end;
begin
  Result:=False;
  if length(Trim(Dt)) = 10 then
    begin
      Dia:=StrToIntDef(Copy(Dt,1,2),0);
      Mes:=StrToIntDef(Copy(Dt,4,2),0);
      Ano:=StrToInt(Copy(Dt,7,4));
      if ( (Mes in [1,3,5,7,8,10,12]) and (Dia in [1..31]) ) or
        ( (Mes in [4,6,9,11]) and (Dia in [1..30]) ) or
        ( (Mes = 2) and ( AnoBissesto(Ano)) and (Dia in [1..29]) ) or
        ( (Mes = 2) and (not AnoBissesto(Ano)) and (Dia in [1..28]) ) then
        Result:=True;
    end;
end;
exports DataOk;

esse é um “antigo” código em delphi pra verificar se é uma data valida com os dados validos

em java

public boolean DataOk(String Dt)
    {
        Byte Dia,Mes;
        Integer Ano;
        public boolean AnoBissesto (Integer Year)
        {
            AnoBissesto((ano%4) ==0);
            return AnoBissesto();
        }
        
    }

alguém com um bom coração se disponibiliza me ajuda a converter

11 Respostas

G
public boolean DataOk(String Dt)
    {
      Byte Dia,Mes;
      Integer Ano; 
      
      if(Dt.trim().length()==10)
        {
         Dia = Byte.parseByte(Dt.substring(1,2),0);
         Mes = Byte.parseByte(Dt.substring(3,5),0);
         Ano = Integer.parseInt(Dt.substring(3,5));
         if ((Mes in [1,3,5,7,8,10,12])&&(Dia in [1..31]))
        }
    }
T

A tradução literal do seu método "AnoBissesto" (a língua portuguesa é cheia de surpresas, e o dicionário diz que é "AnoBissexto" é:

{ Pascal }
 function AnoBissesto(Year :Integer): boolean ;  
 begin  
   AnoBissesto:=(ano mod 4=0) and ( ano mod 100 <> 0) or (ano Mod 400 =0);  
 end;
// Java
boolean isAnoBissexto (int ano) {
    return ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0;
}

Note que, em Java, o correspondente a atribuir ao nome da própria função (ou então à variável especial Result) que existe no Pascal é "mais ou menos" usar return.

Eu digo que é "mais ou menos" porque return já força o retorno da função imediatamente, enquanto que em Pascal (Delphi) você só sai no fim da função (acho que existe um método especial no Delphi que força o retorno antes do fim, mas não consigo achar qual é o nome).

G

Assim????

public boolean DataOk(String Dt)
    {
      Byte Dia,Mes;
      Integer Ano; 
      return false;
      if(Dt.trim().length()==10)
        {
         Dia = Byte.parseByte(Dt.substring(1,2),0);
         Mes = Byte.parseByte(Dt.substring(3,5),0);
         Ano = Integer.parseInt(Dt.substring(3,5));
         if( (Mes.equals(1)||Mes.equals(3)||Mes.equals(5)||Mes.equals(7)||Mes.equals(8)||Mes.equals(10)||Mes.equals(12)) && (Dia>=1 && Dia <=31) )//AnoBissexto(Ano))
           {
             return true;
           }                             
        }
      
      public boolean AnoBissexto (int ano) 
        {   
            return ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0;   
        }  

    }
Está parte estou achando meio complicada pra transforma alguém sabe??
if ( (Mes in [1,3,5,7,8,10,12]) and (Dia in [1..31]) ) or   
        ( (Mes in [4,6,9,11]) and (Dia in [1..30]) ) or   
        ( (Mes = 2) and ( AnoBissesto(Ano)) and (Dia in [1..29]) ) or   
        ( (Mes = 2) and (not AnoBissesto(Ano)) and (Dia in [1..28]) )

Como faço a comparação

celso.martins

thingol:

Eu digo que é "mais ou menos" porque return já força o retorno da função imediatamente, enquanto que em Pascal (Delphi) você só sai no fim da função (acho que existe um método especial no Delphi que força o retorno antes do fim, mas não consigo achar qual é o nome).

Thingol, exit força a saida da function/procedure.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    function testeSaidaFim:String;
    function testeSaidaMeio:String;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(testeSaidaFim);
  ShowMessage(testeSaidaMeio);
end;

function TForm1.testeSaidaFim: String;
begin
  result := 'Inicio';
  result := 'Fim';
end;

function TForm1.testeSaidaMeio: String;
begin
  result := 'Inicio';
  exit;
  result := 'Fim';
end;

end.
celso.martins

gustavoa:

Está parte estou achando meio complicada pra transforma alguém sabe??

if ( (Mes in [1,3,5,7,8,10,12]) and (Dia in [1..31]) ) or ( (Mes in [4,6,9,11]) and (Dia in [1..30]) ) or ( (Mes = 2) and ( AnoBissesto(Ano)) and (Dia in [1..29]) ) or ( (Mes = 2) and (not AnoBissesto(Ano)) and (Dia in [1..28]) )

Como faço a comparação

Cara, dá uma olhada no SimpleDateFormat, usando o setLenient. Isto vai te ajudar a validar uma data.

Naruffy

assim fica mais facil eu acho

public boolean dataOK(String data) {
 boolean retorno = true;
 
 SimpleDateFormat f = new SimpleDateFormat("dd/MM/yy");
  try {
      f.parse(data);
  } catch (ParseException e) {
     retorno = false;
  }
return retorno;
}
G
public boolean DataOk(String Dt)
    {
      //variaveis que recebem o valor
      Byte Dia,Mes;
      Integer Ano; 
      //retorno padrão
      return false;
      //Se a data estiver completa
      if(Dt.trim().length()==10)
        {
         //quebra a string
         Dia = Byte.parseByte(Dt.substring(1,2),0);
         Mes = Byte.parseByte(Dt.substring(3,5),0);
         Ano = Integer.parseInt(Dt.substring(3,5));
         //verifica variaveis
        if(
            ( (Mes.equals(1) || Mes.equals(3) || Mes.equals(5) || Mes.equals(7) || Mes.equals(8) || Mes.equals(10) || Mes.equals(12)) && (Dia>=1 && Dia <=31))
            ||
            ( (Mes.equals(4) || Mes.equals(6) || Mes.equals(9) || Mes.equals(11)) && (Dia>=1 && Dia <=30))
            ||
            ( (Mes.equals(2)) && (AnoBissexto(Ano)) && (Dia>=1 && Dia <=29))
            ||
            ( (Mes.equals(2)) && !(AnoBissexto(Ano)) && (Dia>=1 && Dia <=28))
          )
            {
              return true;
            }                                         
        }
      
       public boolean AnoBissexto (int ano) 
        {   
            return ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0;   
        } 
    }

essa função tá certa???

public boolean AnoBissexto (int ano) 
        {   
            return ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0;   
        }
G

Pronto tá aqui o código

//Função DataOk
    public boolean DataOk(String Dt)
    {
      //variaveis que recebem o valor
      Integer Dia,Mes;
      Integer Ano; 
      //retorno padrão
    
      //Se a data estiver completa
      if(Dt.trim().length()==10)
        {
         //quebra a string
         Dia = Integer.parseInt(Dt.substring(1,2));
         Mes = Integer.parseInt(Dt.substring(3,5));
         Ano = Integer.parseInt(Dt.substring(3,5));
         //verifica variaveis
        if(
            ( (Mes.equals(1) || Mes.equals(3) || Mes.equals(5) || Mes.equals(7) || Mes.equals(8) || Mes.equals(10) || Mes.equals(12)) && (Dia>=1 && Dia <=31))
            ||
            ( (Mes.equals(4) || Mes.equals(6) || Mes.equals(9) || Mes.equals(11)) && (Dia>=1 && Dia <=30))
            ||
            ( (Mes.equals(2)) && (AnoBissexto(Ano)) && (Dia>=1 && Dia <=29))
            ||
            ( (Mes.equals(2)) && !(AnoBissexto(Ano)) && (Dia>=1 && Dia <=28))
          )
            {
              return true;
            } 
        else{  return false;}
        }      
      else
      {  return false;}
     
    }
    public boolean AnoBissexto (int ano) 
     {   
         return ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0;   
     }

somente teria que achar uma forma de otimizar essa parte

if(
            ( (Mes.equals(1) || Mes.equals(3) || Mes.equals(5) || Mes.equals(7) || Mes.equals(8) || Mes.equals(10) || Mes.equals(12)) && (Dia>=1 && Dia <=31))
            ||
            ( (Mes.equals(4) || Mes.equals(6) || Mes.equals(9) || Mes.equals(11)) && (Dia>=1 && Dia <=30))
            ||
            ( (Mes.equals(2)) && (AnoBissexto(Ano)) && (Dia>=1 && Dia <=29))
            ||
            ( (Mes.equals(2)) && !(AnoBissexto(Ano)) && (Dia>=1 && Dia <=28))
          )

não ficou nenhum pouco profissional

B

Esse código é de faculdade ou é pra trabalho de verdade?

Se for pra trabalho use o que o Naruffy postou, adaptando o formato pro teu caso.

THIAGOANALISTA

COMO FAZER PARA USAR ESTE CÓDIGO EM TEMPO DE EXECUÇÃO?

AO DIGITAR A DATA RETORNAR SE É VÁLIDA OU NÃO?

N

Só completando a resposta do usuário Naruffy:

//Função verifica se a data é válida
private boolean isDateValid(String date){
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    df.setLenient(false);
        try {
            df.parse(date);
            return true;
        } catch (ParseException ex) {
            return false;
        }
    }

//Exemplo de uso
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        System.out.println(isDateValid(tfData.getText())?"Válida":"Inválida");
    }
Criado 8 de maio de 2009
Ultima resposta 30 de set. de 2010
Respostas 11
Participantes 7