Calendário Gregoriano dia 31 de Abril

Olá, por favor gostaria muito da ajuda de vocês, este é o meu primeiro post, porquê sempre consegui achar dentro deste fórum ou outros as repostas para minha dúvida, mas agora confesso que não achei uma resposta para o que ocorre.
Estou utilizando um programa que armazena dados e suas respectivas datas em arquivos txt, mas, a fonte de dados que eu utilizo está no GMT 0, ou seja as horas estão acrescidas de 3 horas para o horário do Brasil que é GMT -3.
O meu objetivo é fazer a correção do GMT 0 para o GMT -3 de forma coerente, porque tentei de diversas formas e o que ocorre é que o dia 1 de maio 00:00 cai no dia 31 de abril 21:00.
Eu estou usando o calendário gregoriano, instânciado da seguinte forma:

GregorianCalendar c = new GregorianCalendar();

Estou setando os dias mês e horas da seguinte forma (não acredito que haja problemas aqui,mas, em via das dúvidas):

c.set(Calendar.YEAR, Integer.parseInt(data[0]));
c.set(Calendar.MONTH, strToMonth(data[1]));
c.set(Calendar.DAY_OF_MONTH, Integer.parseInt(data[2]));
c.set(Calendar.HOUR_OF_DAY, Integer.parseInt(data[3]));
c.set(Calendar.MINUTE, Integer.parseInt(data[4]));
c.set(Calendar.SECOND, 0);

Já tentei fazer esta atualização do GMT 0 para o GMT -3 das seguintes formas:

1)Setando em Milis e subratindo a quantidade de Milisegundos equivalentes a três horas.
c.setTimeInMillis(c.getTimeInMillis()- 1000 * 60 * 60 * 3);

2)Subratindo 3 horas do calendário:
c.add(Calendar.HOUR_OF_DAY, -3);

Agradeço muito a ajuda de vocês, e ficaria muito feliz se houver uma maneira “elegante” de solucionar isto.
Caso contrário vou partir pra um algoritimo braçal =/.

Você está fazendo algo errado, segue ex abaixo:

	[code]GregorianCalendar c = new GregorianCalendar();
	c.clear();

	c.set(Calendar.YEAR, 2011);
	c.set(Calendar.MONTH, 4);
	c.set(Calendar.DAY_OF_MONTH, 1);
	System.out.println(c.getTime());
	
	c.add(Calendar.HOUR_OF_DAY, -3);
	System.out.println(c.getTime());[/code]

Saida:

Sun May 01 00:00:00 GMT-03:00 2011 Sat Apr 30 21:00:00 GMT-03:00 2011

Acredito que estais esquecendo que Janeiro corresponde ao mes 0, Fevereiro 1…
Ai você não verificou realmente que mês esta tratando e esta tratando dos meses Maio/Junho.

Só complementando… se você puder, tente utilizar uma biblioteca melhor que a padrão para fazer contas com Java… por exemplo: Joda-Time. Por exemplo, se sua fonte de dados está com GMT-0 e você quer em GMT-3, você pode fazer (assumindo que strToMonth retorna um número correto, e seu timezone padrão seja o -3):

DateTime original = new DateTime(Integer.parseInt(data[0]), strToMonth(data[1]), Integer.parseInt(data[2]), Integer.parseInt(data[3]), Integer.parseInt(data[4]), 0, 0, DateTimeZone.UTC); DateTime convertida = original.toDateTime(DateTimeZone.getDefault());

Se você quiser manter o trabalho com o java.util.*, pegue um calendário da maneira “padrão”: Calendar c = Calendar.getInstance();, te garante que vai pegar o timezone correto e tudo mais.

Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, Integer.parseInt(data[0])); c.set(Calendar.MONTH, strToMonth(data[1])); c.set(Calendar.DAY_OF_MONTH, Integer.parseInt(data[2])); c.set(Calendar.HOUR_OF_DAY, Integer.parseInt(data[3])); c.set(Calendar.MINUTE, Integer.parseInt(data[4])); c.set(Calendar.SECOND, 0);