[Resolvido] Problema com o Calendar

3 respostas
thiagowig

Fala galera.

Estou passando por um problema no Calendar, que acredito ocorrer por causa do horário de verão.

Estou forçando a utilização do Fuso “GMT-3”, afim de evitar o horário de verão e trabalhar com todos os dias possuindo 24 horas.
Porém, ao setar o TimeZone a mão, algumas funções do calendar não estão retornando os valores corretos.

Exemplo em que busco o dia total no mês de fevereiro de 2012:

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/yyyy");
TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
Calendar calendar = Calendar.getInstance(timeZone);
calendar.setTime(dateFormat.parse("02/2012"));

System.out.println(calendar.getTime());
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));

Saídas:

Wed Feb 01 00:00:00 BRST 2012
31

O getActualMaximum(Calendar.DAY_OF_MONTH) não está retornando o valor 29, que é o total de dias em fevereiro de 2012, está retornando 31, que acredito ter buscado o máximo do mês anterior (janeiro).

Já pesquisei em vários fóruns, sem sucesso.

Alguém sabe me dizer porque isso ocorre? Qual a solução?

Abraços.

3 Respostas

pmlm

Ao fazer o setTime com uma data estás a sobre escrever a timezone.
Em vez de

calendar.setTime(dateFormat.parse("02/2012"));

faz

calendar.set(Calendar.MONTH, Calendar.FEBRUARY);
thiagowig

Funcionou pmlm para a quantidade de dias no mês. Obrigado.

Porém surgiu um outro problema.
Quero que o calendar fique com o primeiro instante do mês: 00:00:00

Executando o código abaixo:

TimeZone timeZone = TimeZone.getTimeZone("GMT-3");
Calendar calendar = Calendar.getInstance(timeZone);

calendar.set(Calendar.YEAR, 2012);
calendar.set(Calendar.MONTH, Calendar.FEBRUARY);

calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR, calendar.getActualMinimum(Calendar.HOUR));
calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMinimum(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE, calendar.getActualMinimum(Calendar.MINUTE));
calendar.set(Calendar.SECOND, calendar.getActualMinimum(Calendar.SECOND));

System.out.println(calendar.getTime());
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println(calendar.getActualMinimum(Calendar.HOUR));

Obtenho o seguinte resultado:

Wed Feb 01 01:00:00 BRST 2012
29
0

O horário está se iniciando com 01 ao invés de 00, como eu pretendia.

Sabe me informar porque isso está ocorrendo?

Abraços.

thiagowig

Resolvido:

Descobri que o:

calendar.getTime();
gera um novo Date com o TimeZone default.

Para contornar este problema e exibir a data com o TimeZone que eu quero (sem horário de verão), é preciso setar também no formatador, o timeZone:

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/yyyy");
TimeZone timeZone = TimeZone.getTimeZone("GMT-3"); 
dateFormat.setTimeZone(timeZone);
System.out.println(format.format(calendar.getTime()));

Obrigado pmlm.

Criado 2 de julho de 2012
Ultima resposta 3 de jul. de 2012
Respostas 3
Participantes 2