Galera oq tem de errada nessa funçãosinha simples?

é uma função pra retornar apenas os dias da semana de uma faixa de data…

porem do dia 01/10/2006 ao dia 10/10/2006, ele retorna 6 dias ao invés de 7… NÃO SEI MAIS OQ FAZER…HEHEHEHE

public class Funcoes{
public static int DiasUteis(Date dataini, Date datafim){
int dias=0;

Calendar calini = new GregorianCalendar();
Calendar calfim = new GregorianCalendar();

calini.setTime(dataini);
calfim.setTime(datafim);    

while(calini.before(calfim) || calini.equals(calfim)){

     
  if ((calini.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) && (calini.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)){
    dias+= 1;  //dias+= -1;
  } 

calini.add(Calendar.DAY_OF_MONTH , 1);
}

return dias;
}
}

Primeiramente, você precisa dar uma lida nesse artigo:
http://www.guj.com.br/posts/list/50115.java

Isso é problema do horário de verão, que muda mais ou menos em outubro.
O que ocorre é que de 01/10/2006 00:00:00 a 10/10/2006 00:00:00 deve haver apenas 6 dias e 23 horas, em vez de 7 dias.
Uma dica é a seguinte: para evitar esses problemas, faça as contas com 01/10/2006 00:00:00 a 10/10/2006 01:00:00 (adicione sempre uma hora no dia final).
Dessa maneira, vai haver 7 dias.
Mesmo que você não tenha a transição do horário de verão (por exemplo, em junho não há horário de verão), você vai ter algo como 7 dias e uma hora, que pode ser desprezada.

Ops, dias da semana.
Sorry.

Boa essa hein Thingol. Nao tinha pensado nisso do horário de verão.

Glera eu estou passando duas datas…
a inicial
Thu Oct 05 00:00:00 BRT 2006

e a final

Tue Oct 10 00:00:00 BRST 2006

oq é esse BRST E BRT e como eu faço pra eles ficarem igual??

[quote=thingol]Isso é problema do horário de verão, que muda mais ou menos em outubro.
O que ocorre é que de 01/10/2006 00:00:00 a 10/10/2006 00:00:00 deve haver apenas 6 dias e 23 horas, em vez de 7 dias.
[/quote]

Aham, falha nossa - é óbvio que a resposta certa é 9 (10 - 1), não 7. Quem está pensando em octal aqui?

sim…mais como eu corrigo…para enviar a data ja certa para função ???

e não com esses brst

[quote=thingol][quote=thingol]Isso é problema do horário de verão, que muda mais ou menos em outubro.
O que ocorre é que de 01/10/2006 00:00:00 a 10/10/2006 00:00:00 deve haver apenas 6 dias e 23 horas, em vez de 7 dias.
[/quote]

Aham, falha nossa - é óbvio que a resposta certa é 9 (10 - 1), não 7. Quem está pensando em octal aqui? [/quote]

Desculpe mas a confusão persiste. A resposta certa seria 10 se não fossem excluídos os sábados e domingos. Mas a estrutura condicional do código citado faz essa exclusão. Assim, a resposta certa evidentemente é 7.

BRST é Brazil Summer Time enquanto BRT é Brazil Time. Eles não ficarão iguais. O dia 1 eh horário normal, o dia 10 é horário de verão. Assim, a solução seria que vc adicionasse uma hora sempre ao horário final, como já foi dito. O que está acontecendo é que vc está passando um intervalo de 6 dias e 23 horas, e não 7 dias. Lembre-se do horário de verão.

Hum, tinha esquecido dos sábados e domingos. (É por isso que tinha achado que ele estava usando um método “força bruta” demais.) E os feriados?

Galera alterei para

adicionei a seguinte linha “calfim.add(Calendar.HOUR , 1);”

MAIS NÃO FUNCIONA…não aguento mais isso EHhuehuEHEHHUE
quanto aos feriados, eu tenho uma tabela de feriados que usuario cadastra conf. sua regiao, e dou um select between nela. Foi a unica solução eheheheh


public class Funcoes{
  public static int DiasUteis(Date dataini, Date datafim){
    int dias=0;

    Calendar calini = new GregorianCalendar();
    Calendar calfim = new GregorianCalendar();

    calini.setTime(dataini);
    calfim.setTime(datafim);    
    calfim.add(Calendar.HOUR , 1);
    
   while(calini.before(calfim) || calini.equals(calfim)){
    
         
      if ((calini.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) && (calini.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)){
        dias+= 1;  //dias+= -1;
      } 
   

   calini.add(Calendar.DAY_OF_MONTH , 1);
   }
   
   return dias;  
  }

[quote=saga_fuel]Galera alterei para

adicionei a seguinte linha “calfim.add(Calendar.HOUR , 1);”

MAIS NÃO FUNCIONA…não aguento mais isso EHhuehuEHEHHUE
quanto aos feriados, eu tenho uma tabela de feriados que usuario cadastra conf. sua regiao, e dou um select between nela. Foi a unica solução eheheheh[/quote]
O que quer dizer não funciona? Continua retornando 6 dias? Tente adicionar mais de uma hora.

ehhehehehe tb não funcionou…coloquei 3 dias…

eu acho que o problema esta no looping …eheheh ta complicado…

muito estranho…

HUEHuheHUEHhuehuEHhuehuEHe

GALERA FUNCIONOU!!!
tive que fazer isso…eu só não entendi o pq mais funcionou

VLWSSSSSSSSS…SE ALGUEm puder explica ai pq assim funcionou

ABRAÇOSSSSSSS

[quote=saga_fuel]HUEHuheHUEHhuehuEHhuehuEHe

GALERA FUNCIONOU!!!
tive que fazer isso…eu só não entendi o pq mais funcionou

VLWSSSSSSSSS…SE ALGUEm puder explica ai pq assim funcionou

ABRAÇOSSSSSSS[/quote]
Tenta colocar apenas uma hora no calendário inicial? Funciona? Se funcionar o fato é que akela uma hora acrescida no calendário final não faz diferença. Afinal o dia 10/10/2006 00:00:00 + uma hora resulta em: 10/10/2006 01:00:00. Isto é um acréscimo num dia que já eh horário de verão, logo, nao faria diferença;
Porém a hora acrescida ao dia 1/10/2006 00:00:00 resulta em: 1/10/2006 01:00:00 que será assim até o decréscimo de uma hora que ocorre neste intervalo. Este acrescimo de uma hora anula o decréscimo de uma hora do harário de verão, que começa algum dia deste intervalo. Esta hora portanto resultará em um intervalo de 7 dias e 0 horas, e não mais de 6 dias e 23 horas. Compreende?

fiz isso ja…

mais não funcionou…não sei se eu to comendo bola…

ñão sei oq é…

hehehe

Isto é chamado “programação genética”, ou mais caridosamente, “programação por tentativa e erro”.

GALERAAAAAAA VLWSSS A AJUDA DE TODO MUNDO …

MUITO OBRIGADO…

ACHO Q NÃO IA DESCOBRIR QUE ERA ESSE O PROBLEMA O HORARIO DE VERAO…

MUITO OBRIGADO MSM…ABRAÇOSS