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…