Resolvido - metódo completa Data

9 respostas
G

olá estou tentando converte um antigo código meu do delphi pra java
ele tem a função por exemplo de quando eu informa
data do tipo 07/05/99
ele substitua o 99 por 1999

function CompletaData(DataEntrada:string):string; stdcall;
var
 dia,mes,dataano, data1, data2, DataCompleta : string;
begin
  dia     := copy(DataEntrada,1,2);
  mes     := copy(DataEntrada,4,2);
  dataano := copy(DataEntrada,7,4);
  data1   := Copy(DataEntrada,7,8);
  data2   := copy(DataEntrada,9,10);

  if (trim(data1) <= '99') and (trim(data1) >= '50') and (length(trim(data2))=0)
  then dataano := '19'+data1
  else if (data1 >= '0') and (data1 < '50') and (length(trim(data2))=0)
       then dataano := '20'+data1
       else if length(trim(data1 + data2)) = 0
            then dataano := FormatDateTime('yyyy',now);
  if length(trim(mes)) = 0
  then mes := FormatDateTime('mm',now);
  if length(trim(dia)) = 0
  then dia := FormatDateTime('dd',now);

 DataCompleta := (dia+'/'+mes +'/'+ dataano);
 result := DataCompleta;
end;
exports CompletaData;

em java ele tá ficando assim

public String CompletaData(String DataEntrada)
    {
      String dia,mes,ano, data1, data2, DataCompleta;
      
      dia = DataEntrada.substring(1,2);
      mes = DataEntrada.substring(3,5); 
      ano = DataEntrada.substring(6,10);  
      data1 = DataEntrada.substring(6,8);  
      data2 = DataEntrada.substring(8,10);  
      
      
      if (trim(data1)<= "99") && (trim(data1) >= "50") && (length(trim(data2))=0)
      {
          
      }
      DataCompleta = (dia+"/"+mes +"/"+ ano);
      return DataCompleta;
    }

alguém pode me ajudar a converte o código para java

9 Respostas

T

Você não pode comparar 2 strings com ">" ou "<". Em vez disso, é mais simples converter o valor para um número, e comparar o tal número. Para converter uma String para um int, por exemplo, use Integer.parseInt.

Se você está fazendo isso para seu serviço, em vez de ser para uma lição de casa de escola, seja mais profissional e use os métodos prontos que existem no Java. O que você quer fazer (converter 05/07/99 para 05/07/1999; se for entre 50 e 99, considerar 1900, e se for entre 00 e 49 considerar 2000, é feito assim:

import java.text.*;

class CompletaData {
    private static SimpleDateFormat df1;
    private static SimpleDateFormat df2;
    static {
        df1 = new SimpleDateFormat ("dd/MM/yy");
        df2 = new SimpleDateFormat ("dd/MM/yyyy");
        try { df1.set2DigitYearStart (df2.parse ("01/01/1950")); } catch (ParseException ex) {}
    }
    public static String completaData (String data) {
        try { return df2.format (df1.parse (data)); } catch (ParseException ex) { return data; }
    }
    public static void main (String[] args) {
        System.out.println (completaData ("01/01/00"));
        System.out.println (completaData ("01/01/09"));
        System.out.println (completaData ("01/01/49"));
        System.out.println (completaData ("01/01/50"));
        System.out.println (completaData ("01/01/80"));
        System.out.println (completaData ("31/12/99"));
    }
}
G

dessa forma que você mostru realmente é muito mais elegante, porém não estou entendendo umas coisas, no seu exemplo é uma classe e no meu é apenas um metódo

public String CompletaData(String DataEntrada)
    { 
      String DataCompleta;
      SimpleDateFormat df1;   
      SimpleDateFormat df2; 
      
        df1 = new SimpleDateFormat ("dd/MM/yy");   
        df2 = new SimpleDateFormat ("dd/MM/yyyy");           
        try 
          { 
            df1.set2DigitYearStart (df2.parse ("01/01/1950")); 
          } 
        catch (ParseException ex) 
          {
              JOptionPane.showMessageDialog(this, ex); 
          }

        try 
          { 
            return df2.format (df1.parse (DataEntrada)); 
          }
        catch (ParseException ex) 
          { 
            JOptionPane.showMessageDialog(this, ex);
          }                 
  
      return DataCompleta;
    }
T

Eu pus dentro de uma classe porque há um inicializador estático e mais algumas coisinhas chatas. Fiz desse jeito para não ficar criando vários objetos SimpleDateFormat.

(Entretanto, se você precisar chamar esse meu método em uma aplicação multithread o seu método, embora seja um pouquinho mais lento, dá menos problemas. É que SimpleDateFormat não é thread-safe e isso já vi dar problemas.)

G
df1 = new SimpleDateFormat ("dd/MM/yy");     
    df2 = new SimpleDateFormat ("dd/MM/yyyy");             
    try   
      {  
       //O que esse comando faz????
        df1.set2DigitYearStart (df2.parse ("01/01/1950"));   
      }   
    catch (ParseException ex)   
      {   
          JOptionPane.showMessageDialog(this, ex);   
      }

e se eu infoma somente o dia e o mês o ano não completa

T

Hum, não tinha olhado com atenção o seu programa original. Quando você passa apenas “01/12” ele tem de retornar “01/12/2009”, é isso?

G

aham o ano atual por isso eu tive que quebra a data no delphi pra eu poder tratar

if length(trim(data1 + data2)) = 0   
            then dataano := FormatDateTime('yyyy',now); 
  
  if length(trim(mes)) = 0   
  then mes := FormatDateTime('mm',now);  
 
  if length(trim(dia)) = 0   
  then dia := FormatDateTime('dd',now);

e não precisa ser exatamente 01/12 qualquer data vai funciona

caso a parte do ano não for informada ele pega o ano atual

e se for informado apenas uma parte do ano Ex: 99,01 ele me trás o ano respectivamente 1999 e 2001

G
public String CompletaData(String DataEntrada)
    {       
        String dia,mes,ano, data1, data2, DataCompleta;   
     
        dia = DataEntrada.substring(1,2);   
        mes = DataEntrada.substring(3,5);   
        ano = DataEntrada.substring(6,10);     
        data1 = DataEntrada.substring(6,8);     
        data2 = DataEntrada.substring(8,10);     
        
        int dataP = Integer.parseInt(data1); 
        //(data2.length()==0) dá erro sugestões??? 
        if (((dataP <= 99 ) && (dataP >= 50))&& (data2.length()==0))
          {   
            JOptionPane.showMessageDialog(this,"chegou");
          }
        JOptionPane.showMessageDialog(this,"saiu");

      DataCompleta = (dia+"/"+mes +"/"+ ano);     
      return DataCompleta;
    }
G

tá quase

G

solucionado

Criado 7 de maio de 2009
Ultima resposta 8 de mai. de 2009
Respostas 9
Participantes 2