Calendar.MONTH retorna mês errado

Olá, o código cal.get(Calendar.MONTH) retorna mês 3 e não 4.
O relógio e data da minha máquina estão corretos. “quarta-feira, 29 de abril de 2009”
No painel de controle->Opções regionais e de idioma está tudo configurado para Brasil.
Sistama Win XP Pro.
Se alguém souber o porquê, eu agradeço.

[code]public class TesteData {

public static void main(String[] args) {
	GregorianCalendar dataAtual = new GregorianCalendar();
    Date data = dataAtual.getTime();
	Calendar cal = null;
	cal = Calendar.getInstance();
	cal.setTime( data );
	try {
		int horas    = cal.get(Calendar.HOUR_OF_DAY);
			System.out.println("horas: " + horas);
		int minutos  = cal.get(Calendar.MINUTE);
			System.out.println("minutos: " + minutos);
		int segundos = cal.get(Calendar.SECOND);
			System.out.println("segundos: " + segundos);
		int ano = cal.get(Calendar.YEAR);
			System.out.println("Ano: " + ano);
		int mes = cal.get(Calendar.MONTH);
			System.out.println("mes: " + mes);
		int dia = cal.get(Calendar.DAY_OF_MONTH);
			System.out.println("dia: " + dia);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

}[/code]
Saída:
horas: 11
minutos: 43
segundos: 50
Ano: 2009
[color=red]mes: 3[/color] <-- deveria ser 4
dia: 29

get (Calendar.MONTH) retorna Calendar.APRIL, que é 3 (e não 4).

CUIDADO!

Isso é uma doideira herdada do C, onde janeiro é o mês zero, provavelmente para poder indexar em um array de nomes de meses.

http://java.sun.com/j2se/1.4.2/docs/api/constant-values.html#java.util.Calendar.APRIL

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#APRIL

Eu preciso passar para um comando a data do sistema na hora em que um processo for executado. Nesse caso eu teria que sempre somar 1 ao mês?

Pode somar +1 sem problemas. Se você tiver alguma dúvida, veja os valores de Calendar.JANUARY até Calendar.DECEMBER.

Ou pare de sofrer com calendar e use uma API decente para isso.

Obrigado pela ajuda.

Irei pesquisar, mas, de forma resumida, qual a vantagem da Joda Time - Java date and time API?