Bug maluco no GregorianCalendar.DAY_OF_WEEK - JDK 1.5.0!

6 respostas
E

Eu estava com um erro no sistema que ao rodar:

GregorianCalendar dataaux = new GregorianCalendar(2006,3,7);

ele retornava como sexta-feira (FRIDAY=6).
Achei que poderia ser alguma bobeira no meu codigo.
Entao fiz este programa simples para varrer todas as datas de 2006:

import java.util.GregorianCalendar;
public class checadata {
  public static void main(String[] args) {
    int dia, mes, ano, Result;
    for (ano = 2006; ano <= 2006; ano++) {
      for (mes = 1; mes <= 12; mes++) {
        for (dia = 1; dia <= 31; dia++) {
          try {
            GregorianCalendar dataaux = new GregorianCalendar(ano,mes,dia);
            Result = dataaux.get(GregorianCalendar.DAY_OF_WEEK);
            System.out.println("Data:" + dia + "/" + mes + "/" + ano + " - Dia da Semana:" + Result);
          } catch (Exception e) {
            // nao faz nada, apenas para nao ficar perdendo tempo com checagem de dias
            e.printStackTrace();
          }
        }
      }
    }
    
  }
}

Achei que ele iria pular dias SINISTROS como 30 de fevereiro!
Pois ele nao deu erro e mandou ver na impressao:
Data:29/2/2006 - Dia da Semana:4
Data:30/2/2006 - Dia da Semana:5
Data:31/2/2006 - Dia da Semana:6
… e com isso segue imprimindo de forma maluca o dia da semana…
Data:1/3/2006 - Dia da Semana:7
Data:2/3/2006 - Dia da Semana:1
Data:3/3/2006 - Dia da Semana:2
Data:4/3/2006 - Dia da Semana:3
Data:5/3/2006 - Dia da Semana:4
Data:6/3/2006 - Dia da Semana:5
Data:7/3/2006 - Dia da Semana:6

Tem algum jeito de passar algum parametro para o GregorianCalendar se comportar de maneira "normal"?

6 Respostas

1112

Olá,

Procure sempre ler a documentação antes de usar a API:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/GregorianCalendar.html#GregorianCalendar(int,%20int,%20int)

Ou seja, new GregorianCalendar(2006,3,7) cria um GregorianCalendar com data 7 de abril de 2006, que é amanhã, e que é sexta.

Outra coisa, você não precisa instanciar um novo GregorianCalendar para avançar a data. Para incrementar a data em um dia, use add(): http://java.sun.com/j2se/1.5.0/docs/api/java/util/GregorianCalendar.html#add(int,%20int)

E

Obrigado!
Eu estava olhando a API agora a pouco e vi que o MONTH comeca de 0 mesmo, em JANUARY!
Agora porque nao da nenhuma excecao ao passar como parametro, por exemplo, 31/02/2006?

1112

edilmar:
Obrigado!
Eu estava olhando a API agora a pouco e vi que o MONTH comeca de 0 mesmo, em JANUARY!
Agora porque nao da nenhuma excecao ao passar como parametro, por exemplo, 31/02/2006?

Se você usar aquele construtor com os parâmetros 2006, 2 e 31, será 31 de março de 2006, uma data válida. :wink:

De qualquer maneira, mesmo que você passe 2006, 01 e 31 (que equivaleria a 31 de fevereiro de 2006), ele não lançará exceção. Mas, se você pegar os campos DAY_OF_MONTH e MONTH, ele mostrará que converteu para 03 de março de 2006 (28 de fevereiro + 3 dias ). :wink:

Fabricio_Cozer_Marti

#@®®¡$:
edilmar:
Obrigado!
Eu estava olhando a API agora a pouco e vi que o MONTH comeca de 0 mesmo, em JANUARY!
Agora porque nao da nenhuma excecao ao passar como parametro, por exemplo, 31/02/2006?

Se você usar aquele construtor com os parâmetros 2006, 2 e 31, será 31 de março de 2006, uma data válida. :wink:

De qualquer maneira, mesmo que você passe 2006, 01 e 31 (que equivaleria a 31 de fevereiro de 2006), ele não lançará exceção. Mas, se você pegar os campos DAY_OF_MONTH e MONTH, ele mostrará que converteu para 03 de março de 2006 (28 de fevereiro + 3 dias ). :wink:


aprender a lembrar que existe o método [color=red]setLenient(false)[/color] faz bem pra saúde :wink:

Grinvon

Também estou achando estranho, fiz um método aqui rápido para saber a diferença de “hora” entre duas datas…

public long getHour(long dataFinal, long dataInit) {

    long result = (dataFinal - dataInit);
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(result);

    return cal.get(Calendar.HOUR);
}

e ele me mostra sempre a hora como 9.

Fabricio_Cozer_Marti

Grinvon:
Também estou achando estranho, fiz um método aqui rápido para saber a diferença de “hora” entre duas datas…

public long getHour(long dataFinal, long dataInit) {

    long result = (dataFinal - dataInit);
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(result);

    return cal.get(Calendar.HOUR);
}

e ele me mostra sempre a hora como 9.


ué, mas o que seria seu ‘sempre’ mostra 9 ?

a data início do calendário é :
Wed Dec 31 21:00:00 BRT 1969
21=9, ou seja, se vc a diferenca entre dataFinal e dataInit é pouca, vc ‘sempre’ vai ter nove.

Quer ver, faça um teste chamando assim :
getHour(System.currentTimeMillis(), 0);

Criado 6 de abril de 2006
Ultima resposta 6 de abr. de 2006
Respostas 6
Participantes 4