Calendar

7 respostas
B

Pessoal, estou enfrentando alguns problemas com a utilização da Classe Calendar (e GregorianCalendar).
As vezes preciso alterar o locale para GMT, e esta configuração é transferiada para todas as aplicações que rodam na JVM do servidor, causando problemas para outras aplicações.
Parece que o atributo locale é compartilhado por toda a JVM, mas este problema foi resolvido na versão 1.4.2_6
Não tenho como atualizar a JVM do meu cliente, e, portanto, preciso encontrar outra solução.
Algum de vocês poderia me indicar alguma classe de calendario que seja mais funcional e melhor definida do que a Calendar?

[]`s

7 Respostas

B

aaaalguem?

J

Você falou a solução que tentou implementar e o erro que está dando. Volta um pouco na história e diz o que está tentando fazer na sua aplicação (mudar para GMT foi a solução que você tentou, mas o que te motivou a usar essa solução?).

Às vezes existem outras saídas que não enxergamos pq estamos focados demais naquela solução que achamos ser a melhor (mas pq derrubar uma porta quando tem uma janela aberta do outro lado?).

B

Bem… o problema é o seguinte:

Preciso gerar uma lista de datas a partir de um periodo informado.

Exemplo: 8/8/2005 >> 16/8/2005

Ele deverá gerar as datas 8, 9, 10 …16!

O problema acontece quando precisamos gerar datas para o mês outubro, pois o Calendar não reconhece a data 8/10/2005 00:00:00, ou ele soma mais um ou ele volta um.
Para resolver isto, mudandos o TimeZone para GMT, pois não existe horario de verão. Só que isto implica em outro problema!
Se salvamos uma data no banco como 12/08/2005 01:00:00, quando o TimeZone era GMT-03:00, quando buscamos esta data usando o timeZone GMT, ela é retornada como 11/08/2005 22:00:00.
O ideal seria que pudessemos usar GMT apenas para gerar a lista de datas, mas se voltarmos o timezone para GMT-03:00, as datas são automaticamente alteradas.
O TimeZone é setado para toda a JVM, e não para as instancias de datas ou calendarios!

J

Mas, hein?
Você pode colocar esse trecho de código aqui?
Que coisa mais sinistra.

B

Simples:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH,7);
cal.set(Calendar.MONTH,10);
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
List lista = new ArrayList();
for (int i =0; i<10;i++) {
lista.add(cal.getTime());
cal.add(Calendar.DAY_OF_MONTH,1);
}

Mas isso ocorre no timezone America/Sao_Paulo

J

Roberto, não consegui ver o problema. Aqui funcionou certinho (eu acho).

Olha só (só não repara no nome da classe):

import java.util.*;

class DataFDP
{
  public static void main(String args[])
  {
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.DAY_OF_MONTH,7); 
    cal.set(Calendar.MONTH,10); 
    cal.set(Calendar.HOUR,0); 
    cal.set(Calendar.MINUTE,0);
    System.out.println("" + cal); 
    List lista = new ArrayList(); 
    for (int i =0; i<10;i++) { 
    lista.add(cal.getTime()); 
    // System.out.println("" + cal); 
    cal.add(Calendar.DAY_OF_MONTH,1); 
    System.out.println(cal.get(Calendar.DAY_OF_MONTH));
    }
  }
}
"Resultou":
C:\java>javac DataFDP.java

C:\java>java DataFDP
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenie
nt=true,zone=sun.util.calendar.ZoneInfo[id="America/Sao_Paulo",offset=-10800000,
dstSavings=3600000,useDaylight=true,transitions=129,lastRule=java.util.SimpleTim
eZone[id=America/Sao_Paulo,offset=-10800000,dstSavings=3600000,useDaylight=true,
startYear=0,startMode=3,startMonth=9,startDay=8,startDayOfWeek=1,startTime=0,sta
rtTimeMode=0,endMode=3,endMonth=1,endDay=15,endDayOfWeek=1,endTime=0,endTimeMode
=0]],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2005,MONTH=10,WEEK_OF_
YEAR=33,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=223,DAY_OF_WEEK=5,DAY_OF_WEEK
_IN_MONTH=2,AM_PM=1,HOUR=0,HOUR_OF_DAY=22,MINUTE=0,SECOND=32,MILLISECOND=650,ZON
E_OFFSET=-10800000,DST_OFFSET=0]
8
9
10
11
12
13
14
15
16
17

Será que não está havendo uma confusão com o mês? Vi que você falou de outubro e colocou 10 no código, mas outubro é 9 (o mês vai de 0 a 11).

B

Ah sim, desculpa! eh que eu nao copiei o codigo…fui digitando pra vc ter uma idéia.

A questão não é de ter as datas! é que eu precisava das datas 07/10/2005 00:00, 08/10/2005 00:00, 09/10/2005 00:00…

só que 08/10/2005 00:00 não existe em “America/Sao_Paulo”.

Eu já “resolvi” o problema aqui, usamos GMT-03:00.

[]`s

Criado 5 de agosto de 2005
Ultima resposta 12 de ago. de 2005
Respostas 7
Participantes 2