Diferença de dias

Oiii será que alguem poderia me ajudar?

tenho este codigo

	public void executar(HttpServletRequest req, HttpServletResponse res)
			throws Exception {
		// TODO Auto-generated method stub
		String msg="", status="";

		try {
			String strIdProgramacao = req.getParameter("idProgramacao");
			String dataInicio = req.getParameter("dataInicio");
			Calendar calInicio = ConverteData.getCalendarByDataBr(dataInicio);
			String dataFim = req.getParameter("dataFim");
			Calendar calFim = ConverteData.getCalendarByDataBr(dataFim);

			int diferencaDeDias = (int)((calFim.getTimeInMillis() - 
					calInicio.getTimeInMillis())/(1000*60*60*24));
			
			HttpSession session = req.getSession();
			Programacao progTemp = (Programacao)session.getAttribute("programacao");
			List<Sessao> sessoes = new ArrayList<Sessao>();
			if(strIdProgramacao==null||strIdProgramacao==""){
				for(int j=0;j<diferencaDeDias;j++){
					String aData = ConverteData.parseDateToBr(calInicio);
					for(Sessao s : progTemp.sessoes){
						Sessao novaSessao = new Sessao(aData,
								s.getHorarioSessao(),
								s.getSala(),
								s.getFilme());
						sessoes.add(novaSessao);
					}
					calInicio.roll(Calendar.DAY_OF_MONTH, true);
				}
			}else{
				for(int j=0;j<=diferencaDeDias;j++){
					String aData = ConverteData.parseDateToBr(calInicio);
					for(Sessao s : progTemp.sessoes){
						Sessao novaSessao = new Sessao(Long.parseLong(strIdProgramacao),
								aData,
								s.getHorarioSessao(),
								s.getSala(),
								s.getFilme());
						sessoes.add(novaSessao);
					}
					calInicio.roll(Calendar.DAY_OF_MONTH, true);
				}
			}		
			
			DAOFactory dao = DAOFactory.getDAOFactory(DAOFactory.MYSQL);
			ProgramacaoDAO programacaoDAO = dao.getProgramacaoDAO();
			
			Programacao programacao;
			if(strIdProgramacao==null||strIdProgramacao==""){
				programacao = new Programacao(dataInicio, dataFim, sessoes);
				programacaoDAO.inserirProgramacao(programacao);
			}else{
				programacao = new Programacao(Long.parseLong(strIdProgramacao),dataInicio, dataFim, sessoes);
				programacaoDAO.alterarProgramacao(programacao);
			}

			session.removeAttribute("programacao");
			
			dao = null;			programacaoDAO = null;
			
			status = "ok";
			msg = (strIdProgramacao==null||strIdProgramacao=="") ? "Gravação" : "Atualização";
			msg += " da programação foi realizada com sucesso!";
			
		}catch(RuntimeException e){
			status = "erro";
			msg = "Erro durante a gravação da programação." + e.getMessage();
		}catch (Exception e) {
			status = "erro";
			msg = "A Programação não pode ser alterada. Existem bilhetes vendidos para esta programação." ; 
			//msg = e.getMessage();
		}finally{
			req.setAttribute("msg", msg);
			req.setAttribute("status", status);
		}
	}

Mas estou com um problema na diferença de dias

se a data inicial for de um mes e a data final for de outro mes, ele não muda o mes…
Por exemplo: 30/03/2007 (dt inicial)
01/04/2007 (dt final)

ele me responde em vez de 01/04 … 01/03

alguem sabe oq estou fazendo de errado…???

a) A diferença entre duas datas, se houver uma transição de horário de verão, não é o que você espera:

 			int diferencaDeDias = (int)((calFim.getTimeInMillis() - 
 					calInicio.getTimeInMillis())/(1000*60*60*24));

O correto seria (para levar em conta o fato que volta e meia descontam uma hora de um dia, como é o caso do início do horário de verão):

private static final long MS_POR_HORA = 1000L * 60 * 60; 
private static final long MS_POR_DIA = MS_POR_HORA * 24;
...
 			int diferencaDeDias = 

(int)((calFim.getTimeInMillis() 
- calInicio.getTimeInMillis() 
+ MS_POR_HORA) 
/ MS_POR_DIA);

b) Se quiser incrementar uma data, não use “roll” nesse seu caso. Use simplesmente “add”, que funciona direitinho.

calInicio.add(Calendar.DAY_OF_MONTH, 1);

[quote=thingol]a) A diferença entre duas datas, se houver uma transição de horário de verão, não é o que você espera:

 			int diferencaDeDias = (int)((calFim.getTimeInMillis() - 
 					calInicio.getTimeInMillis())/(1000*60*60*24));

O correto seria (para levar em conta o fato que volta e meia descontam uma hora de um dia, como é o caso do início do horário de verão):

private static final long MS_POR_HORA = 1000L * 60 * 60; 
private static final long MS_POR_DIA = MS_POR_HORA * 24;
...
 			int diferencaDeDias = 

(int)((calFim.getTimeInMillis() 
- calInicio.getTimeInMillis() 
+ MS_POR_HORA) 
/ MS_POR_DIA);

b) Se quiser incrementar uma data, não use “roll” nesse seu caso. Use simplesmente “add”, que funciona direitinho.

calInicio.add(Calendar.DAY_OF_MONTH, 1);

[/quote]

Nossaaa mtooo obrigado… estava travada nisso o dia todo… e funcionou direitinho… brigadão mesmooo

Camilla,

O thingol está certo, mas parcialmente. O mesmo problema vai acontecer quando acabar o horário de verão e pode gerar erros. O ideal é, se você for usar coisas como cálculo de datas, recorrer a uma biblioteca que te permite trabalhar com datas sem timezone (que é a razão desse problema) e coisas como durações, intervalos e períodos, use o Joda-Time.