Ajuda em método que manipula datas

3 respostas
brunoneiva

Fala pessoal, queria uma ajuda num método onde manipulo alguns objetos Date.

A questão é a seguinte, minha aplicação envolve dados climatológicos, chuva, humidade do solo e etc. Na minha base de dados tenho todos esses dados referentes aos dias em que estes dados foram medidos.

Pois bem, quando o usuário quer coletar dados de chuva, por exemplo, do período de 18/12/2000 a 18/01/2001, o mesmo deve escolher o passo de tempo (horário, minuto, diário, mensal, anual). Se eu escolher horário, e em algum dia que esteja dentro do período que eu especifiquei não existir dados (o que não implica que não choveu, pode ter dado algum outro problema), a aplicação tem que informar -99 ao usuário pra mostrar que não tem aquele dado.

No método abaixo tenta fazer isso, porém no primeiro while, ele nunca entra no if que faz o laço parar.

Eu simplesmente passo para esse método toda a série de dados contidos no banco e a partir daí crio uma nova série de dados com os "-99", nesse while eu crio um novo arrayList com todas as datas referentes ao período passado (indepentente de ter ou não dados no banco) e no segundo while eu armazeno essas datas com seus valores em um TreeMap.

Segue o código:

public static TreeMap formatTimeSerieToHourlyExport(TreeMap<Date, String> timeSerie, Date initialDate, Date finalDate) {
        TreeMap<Date, String> result = new TreeMap<Date, String>();
        Set<Date> dates = timeSerie.keySet();
        
//        Date initialDate = (Date) dates.toArray()[0];
//        Date finalDate = (Date) dates.toArray()[dates.size()-1];
        
        ArrayList<Date> newDates = new ArrayList<Date>();
        Date date1 = initialDate;
//        Date date1 = new Date();
//        date1.setTime(initialDate.getTime());
        newDates.add(date1);

        Calendar cal = Calendar.getInstance();
        
        while(true){
            cal.setTime(date1);
            Date date2 = new Date(cal.getTimeInMillis());
            cal.add(Calendar.HOUR_OF_DAY,1);
            date2.setTime(cal.getTimeInMillis());
            newDates.add(date2);
            date1.setTime(date2.getTime());

            if(date2.compareTo(finalDate)==0) break;
        }
        
        Iterator it = newDates.iterator();
        while(it.hasNext()){
            Date date = (Date) it.next();
            if(!dates.contains(date))
                result.put(date,"-99");
            else
                result.put(date, timeSerie.get(date));
        }
        return result;
    }

Abraços

3 Respostas

felipedamiani

cara, já tentasse debuggar isso pra ver qual valor que está vindo no date2 e no finalDate?

brunoneiva

Já sim mano, debuguei geral…=D

O valor de initialDate tá correto bem como o de finalDate…

Tou doido pra resolver isso

heheheh

Ja quebrei a cabeça um montao, mas nao consigo entender qual o erro…

Trabalhar com datas tem sido chato, eu mudei isso pra GregorianCalendar, e quando passava initialDate e finalDate pra uma instancia dessa classe, eles continham valores diferentes dos reais…

Dai fiz tudo com Date e Calendar mesmo…

alguém tem alguma sugetão?

abraços

brunoneiva

Consegui aqui com ajuda de uns amigos =)

Caso alguém se interesse, segue o código.

public static TreeMap formatTimeSerieToHourlyExport(TreeMap<Date, String> timeSerie, Date initialDate, Date finalDate) {
        TreeMap<Date, String> result = new TreeMap<Date, String>();
        Set<Date> dates = timeSerie.keySet();
        
        //1 - As datas do período estão formatadas com um minuto antes para que se
        //pegue todos os dados daquele periodo, isso é desfeito para que seja
        //mostrado ao usuário
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(initialDate.getTime());
        cal.add(Calendar.MINUTE, 1);
        initialDate.setTime(cal.getTimeInMillis());
        
        cal.setTimeInMillis(finalDate.getTime());
        cal.add(Calendar.MINUTE, (-1));
        finalDate.setTime(cal.getTimeInMillis());
        //fim-1
        
        ArrayList<Date> newDates = new ArrayList<Date>();
        Date date1 = initialDate;
        newDates.add(date1);
        
        while(true){
            cal.setTime(date1);
            cal.add(Calendar.HOUR_OF_DAY,1);
            cal.set(Calendar.MINUTE,0);
            cal.set(Calendar.SECOND,0);
            cal.set(Calendar.MILLISECOND,0);
            
            Date date2 = new Date(cal.getTimeInMillis());
            
            if(date2.compareTo(finalDate)<0){
                newDates.add(date2);
                date1.setTime(date2.getTime());
            } else{
                break;
            }
        }
        
        Iterator it = newDates.iterator();
        while(it.hasNext()){
            Date date = (Date) it.next();
            cal.setTimeInMillis(date.getTime());

            if(!dates.contains(date))
                result.put(date,"-99");
            else
                result.put(date, timeSerie.get(date));
        }
        return result;
    }
Abraços!
Criado 18 de abril de 2008
Ultima resposta 18 de abr. de 2008
Respostas 3
Participantes 2