Erro usando Calendar

6 respostas
brunoneiva

Fala pessoal, tou com um problema aqui que não consigo entender nem a pau o que é…

Minha aplicação lê uns dados de arquivos e armazena no banco. O arquivo é lido até um certo ponto, quando chega neste ponto ele não consegue setar a data corretamente em Calendar.

Os arquivos lêem dados nesta forma:
(A segunda coluna é o ano, a terceira o dia no calendário Juliano, e a quarta a hora e minuto)

[list]
30,2006,307,2100,16.69,12.42
30,2006,307,2200,16.69,12.41
30,2006,307,2300,16.69,12.39
30,2006,307,2400,16.69,12.37
30,2006,308,100,16.69,12.36
30,2006,308,200,16.68,12.35
[/list]

Beleza, usei vários arquivos e sempre lançava um PSQLException e eu achava que, como os arquivos são muito inconsistentes, era mais uma linha repetida no mesmo e o banco não permitia armazenar dois valores na mesma data (uma vez que a data é a PK). Percebi que o problema não era esse…

A chamada ao método abaixo:

Date date = getArray30OfFile(txt, gauge)

Passa a linha a ser lida do arquivo (txt) (já debuguei isso, tá blz). O parâmetro Gauge é um bean da minha aplicação, uma estação climatológica.

Este arquivo faz toda a análise sintática da linha, separando ano, mês, dia e etc. E seta em um objeto TimeSerieMinute (uma classe que armazena serie de dados temporais), aquela data e o valor de chuva (por exemplo) daquela data (como uma tabela hash). Isso é feito na chamada a esse método:

TimeSerieMinute timeSerie = new TimeSerieMinute();
        timeSerie.setData(y, m - 1, d, hour, min, value);

Pois bem, nesse método é que tá o erro. As datas são setadas normalmente em Calendar usando set, e quando a hora é 24 no arquivo a propria Calendar já seta o valor pra 0 hora do dia seguinte. Porém na linha do arquivo 30,2006,308,2400,16.68,12.38, onde 308 no calendário Juliano é 4 de Novembro, a hora setada em Calendar deveria ser 0:00 do dia 5 de Novembro (mês 10 em Calendar) de 2006, porém estranhamente Calendar seta essa hora pra ser 1:00 do dia 5. Já tentei fazer isso força usando Calendar.set(Calendar.HOUR_OF_DAY, 0) e ainda assim ele seta 1! Não sei o que fazer!

Segue o método setDatade TimeSerieMinute:

public void setData(int year, int month, int day, int hour, int minute, double value) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month, day, hour, minute);
       
        System.out.println("DEBUG como os parâmetros chegam: "+year+","+month+","+day+","+hour+","+minute);
        System.out.println("DEBUG quando seta o dado no Calendar - "+
                cal.get(Calendar.YEAR)+","+
                cal.get(Calendar.MONTH)+","+
                cal.get(Calendar.DATE)+","+
                cal.get(Calendar.HOUR_OF_DAY)+","+
                cal.get(Calendar.MINUTE));
       
        Date date = new Date(cal.getTimeInMillis());
       
        this.getHashData().put(date, value);
    }

Console:

[list]
DEBUG dados do arquivo - 30,2006,307,2200,16.69,12.41
DEBUG como os parâmetros chegam: 2006,10,3,22,0 (ano, (mês-1), dia, hora, minuto)
DEBUG quando seta o dado no Calendar - 2006,10,3,22,0
DEBUG dados do arquivo - 30,2006,307,2300,16.69,12.39
DEBUG como os parâmetros chegam: 2006,10,3,23,0
DEBUG quando seta o dado no Calendar - 2006,10,3,23,0
DEBUG dados do arquivo - 30,2006,307,2400,16.69,12.37 (Nesse casso dá certo, a hora é 24 do dia 3, portanto ele set hora 0 do dia 4)
DEBUG como os parâmetros chegam: 2006,10,3,24,0 (hora 24 do dia 3)
DEBUG quando seta o dado no Calendar - 2006,10,4,0,0 (setado corretamente pra hora 0 do dia 4)
DEBUG dados do arquivo - 30,2006,308,100,16.69,12.36
DEBUG como os parâmetros chegam: 2006,10,4,1,0

(…)

Erro:
DEBUG dados do arquivo - 30,2006,308,2400,16.68,12.38
DEBUG como os parâmetros chegam: 2006,10,4,24,0
DEBUG quando seta o dado no Calendar - 2006,10,5,1,0 (a hora é setada pra um, sem mais nem menos)
DEBUG dados do arquivo - 30,2006,309,100,16.68,12.37
DEBUG como os parâmetros chegam: 2006,10,5,1,0
DEBUG quando seta o dado no Calendar - 2006,10,5,1,0
[/list]

Bem, é isso! Espero que possam me ajudar…

6 Respostas

T

Perto de 10 de outubro (no seu caso foi dia 5/10/2006, não) o Java sabe que é a transição do horário de verão.

Isso faz com que ele converta automaticamente a data 05/10/2006 00:00 (na verdade você usou 04/10/2006 24:00) para 05/10/2006 01:00. (Adianta automaticamente o relógio nesse dia)

Isso é a origem dessa hora maluca que apareceu do nada.

pimenta

Esse problema é bom quando uma empresa fecha seu movimento do dia após às 23:00, mas o Java “acha” que foi fechado depois da meia noite.
Ou seja, uma movimentação que era pra ter sido gerada no dia 23 é identificada como se tivesse sido gerada no dia 24.

Já tive problema com isso e deu uma bela de uma confusão…

brunoneiva

Você conseguiu resolver?

brunoneiva

Opa! Eu não tinha lido o que o thingo tinha respondido! Li só o do Pimenta, então thingo, como resolvo isso? Vc tem alguma sugestão?

[]'s

pimenta

Como resolver é uma pergunta meio intrigante. Dando uma pesquisada na net sobre esse problema achei esse link que pode servir pra você ou, pelo menos, servir pra te dar um “bizú” do problema e sua solução.

Clique Aqui

Abraaços,

brunoneiva

Resolvido!

Esse link me ajudou

Setei o local para America/Recife e a hora inicial e final para 1 de Janeiro de 1:00

=D

[]'s

Criado 16 de maio de 2008
Ultima resposta 16 de mai. de 2008
Respostas 6
Participantes 3