3
respostas

Boa tarde, problemas com data

Boa tarde, estou importando arquivos .xls que eu importo arquivo excel no meu programa, fiz um teste aqui para debugar para poder entender oque está acontecendo, e cheguei a conclusao, estou debugando via codigo msm.

String[] split = value.split("/");
System.out.println(split[0] + split[1] + split[2]);
System.out.println("Seperar na primeira String : " + split[0]);
Date parse = formato.parse(value);
System.out.println(formato.format(parse));

no meu arquivo excel tenho campo data inicial e data final, porem quando eu uso a data como 01/01/2015 quando eu uso no mes 01 ela não me da o retorno errado, porem quando eu troco essa data por exemplo pode ser de 02 ao 12 ela me retorna uma data muito estanha, algo como '244/09/2018'

no campo dia ela me retorna 3 numeros! Estou usando o campo date no meu projeto, oque pode ser esse bug?

3 respostas

Fala Michel, tudo bem ?

Pelo que eu entendi você recebe uma data seguindo o formato 00/00/0000 que vem do xls. Vindo então essa data nesse reconhecido padrão, não dá pra fazer algo assim ?

Exemplo:

class Datas {    
    public static void main(String[] args) {

        String data1 = "01/01/2015";
        String data2 = "01/12/2016";
        String data3 = "24/09/2018";

        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

        try {
            Date date1 = formatter.parse(data1);
            Date date2 = formatter.parse(data2);
            Date date3 = formatter.parse(data3);

            System.out.println(date1);
            System.out.println(date2);
            System.out.println(date3);
            System.out.println();

            data1 = formatter.format(date1);
            data2 = formatter.format(date2);
            data3 = formatter.format(date3);

            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

Saída (correta):

Thu Jan 01 00:00:00 BRST 2015
Thu Dec 01 00:00:00 BRST 2016
Mon Sep 24 00:00:00 BRT 2018

01/01/2015
01/12/2016
24/09/2018

Como está seu formatador ? A String de formato está montada corretamente? As Strings provenientes da tabela podem estar variando desse padrão? Dê uma olhada nessas questões!

Espero ter ajudado. Abraço!

Fala Rafael tudo tranquilo?

Tenho um arquivo .xls para importar, nesse arquivo eu trabalho com datas, do tipo date, já pensei em mudar para localDate, mais isso não vem ao caso kkk.

Então a data do meu arquivo vem com o dia mt errado, e lá no arquivo do xls já está formatada no padrão brasileiro exemplo 00/00/0000 quando eu tento fazer a importação do meu arquivo para o sistema, a data vem com o dia com 3 digitos, o mes e o ano vem certo, mais o dia vem tudo errado com 3 digitos.

Não sei oque pode ser, já estou convertendo a data para o padrão brasileiro, irei postar o código.

public static Date tryParseDate(String value){
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        try {  
            String[] data = value.split("/");
            if(!data[2].startsWith("20") && data[2].length() == 2)
                data[2] = "20" +  data[2];

             value = data[0] + data[1] + data[2];

             return sdf.parse(value);  
          } catch(Exception nfe) {  
              try {
                return sdf.parse("01/01/1991");
            } catch (ParseException e) {
                e.printStackTrace();
            }
          }
        return new Date();
    }

Como disse a dia vem com 3 digitos :(

Fala Michel,

O problema parece estar na linha que faz a junção das partes do array (gerado pelo split da String original). Perceba que quando faz a concatenação você não coloca novamente as barras, o que dá problema dado o formato registrado no SimpleDateFormat -> dd/MM/yyyy. (As barras importam para o algoritmo interno)

Fiz o seguinte teste e funcionou direitinho para várias datas diferentes:

class Datas {
    public static void main(String[] args) {
        String data1 = "17/07/19";

        Date date = tryParseDate(data1);
        System.out.println(date);
        System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(date));
    }

    public static Date tryParseDate(String value){
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        try {  
            String[] data = value.split("/");
            if(!data[2].startsWith("20") && data[2].length() == 2)
                data[2] = "20" +  data[2];

         // ADICIONANDO NOVAMENTE AS BARRAS
             value = data[0] + "/" + data[1] + "/" + data[2];

             return sdf.parse(value);  
          } catch(Exception nfe) {  
              try {
                return sdf.parse("01/01/1991");
            } catch (ParseException e) {
                e.printStackTrace();
            }
          }
        return new Date();
    }
}

Saída:

Wed Jul 17 00:00:00 BRT 2019
17/07/2019

Sem as barras (value = data[0] + data[1] + data[2]; ) a saída indicada por aqui para a mesma data na entrada foi a seguinte

Tue Jan 01 00:00:00 BRST 1991
01/01/1991

Saída com valor errado

Dê uma olhada se resolve.