Comparar dia e mes entres datas

28 respostas
R

Ola amigos, o que eu uso uso para comparar o dia e mes entre 2 datas. Ou seja, preciso comparar o dia e o ano entre a data_atual e data_passada.

28 Respostas

F

Não sei se entendi o que vc quer, mas seria algo assim?

Calendar dataUm = Calendar.getInstance();
dataUm.setTime(new Date());
		    	
Calendar dataDois = Calendar.getInstance();
dataDois.setTime(new Date());
		    	
int mesUm = dataUm.get(Calendar.MONTH);
int mesDois = dataDois.get(Calendar.MONTH);

Para pegar o dia Calendar.DAY e o ano Calendar.YEAR.

Não sei se tem um modo mais prático, mas é o que me veio a cabeça :lol:

Flw.

V

Pode usar tb os metodos before e after :lol:

F

Mas aí seria uma comparação de toda a data e não especificamente do mês, dia ou ano.

V

Já que está usando datas, pense com muito, muito, muito carinho na possibilidade de deixar o Calendar de lado e usar o JODA-Time:
http://joda-time.sourceforge.net/

R

Eu estou tentanto fazer o seguinte:

Pegar a data_atual (isso ja consegui) Date data_atual = new Date(System.currentTimeMillis()); e comparar ela com outra data, mas precisa ser o mes e o dia. Ou seja , se, data_atual = 14/[b]01/2009e data_passada = 14/01/2008 , naum atende o que eu preciso. Agora se a data_atual = 14/01/2009[b] e data_passada = 30/01/2009[b] , atende. Concluindo, preciso comparar as 2 duas datas e ver as 2 estão no mesmo mes e ano.

Naum sei, se esse tipo de comparação entre meses e dias é possivel através do before,after ou compareTo.

O

Brother, sua pergunta faz parte da série “perguntas padrões que tem seus tópicos garantidos toda semana”. Em outras palavras, sua pergunta já foi repetidamente respondida.

V

Não se usa a classe Date para trabalhar com datas. Você pode notar que praticamente todos os métodos dessa classe estão deprecated. No lugar, use a classe Calendar ou GregorianCalendar. Ou recorra a API Joda-Time, que eu já passei.

Depois disso, fica fácil. Você pode obter qualquer campo de uma data através do método get.

Calendar hoje = Calendar.getInstance();

int dia = hoje.get(Calendar.DAY_OF_MOTH);
int mes = hoje.get(Calendar.MONTH);
int ano = hoje.get(Calendar.YEAR);

Repita o processo para a outra data e aí basta usar ifs, como você faria com qualquer programa normal.

R

Me desculpe pela burrice, mas hj é o primeiro dia que trabalho com data, até os exemplos que procurei e fiz eu entendi. Mas no entanto naum consegui achar uma forma de aplicar no que estou desenvolvendo.

--- pegando data atual
Date data_atual = new Date(System.currentTimeMillis());  

-- guardando em uma variavel o que vem do banco de dados.
Date dt_fat = B1.OPCH.getDate("data_fat"); 

-- tentando compararar as datas
if(dt_fat.before(data_atual)){
					vl_vencer_acumul = B1.OPCH.getDouble("Comprado_Acum");
				}else{
vl_vencer_acumul = 0;
}

Eu sei que esta errado, pq esta comparando apenas a data_fat com a data_atual, no entanto , naum sei como fazer para comparar um mes inteiro.

V

Comece não usando a classe Date.

R

Entaum… depois de uma boa googleada começando a partir das dicas que peguei aqui no fórum e consegui chegar a uma solução que esta ai em baixo.

-- pegando a data atual
Date data_atual = new Date(System.currentTimeMillis());
-- pegando a data que esta no banco
Date dt_fat = B1.OPCH.getDate("data_fat");
-- calculando a diferenca de dias entre a data_atual e data que vem do banco de dados
long DAY = 24L * 60L * 60L * 1000L;
				long diferenca = (( data_atual.getTime() - dt_fat.getTime() ) / DAY );

Espero que isso possa ajudar, ja que foi muito util esse metodo para calcular a diferença entre dias.

V

Raphael, você gosta mesmo de sofrer, não?

Na API que eu indiquei você faria assim.

LocalDate dataAtual = new LocalDate(); LocalDate dt_dat = new LocalDate(B1.OPCH.getDate()); int dias = dataAtual.daysBetween(dt_dat);

Outra coisa, você continua usando a classe Date, no lugar de Calendar. Todos os respondentes aqui disseram para você não fazer isso. Se a idéia é não ler as sugestões do tópico, por que postou sua dúvida no GUJ, em primeiro lugar?

Seu método é rebuscado, extremamente sujeito a erros, difícil de manter, e ainda usa uma classe cuja a API inteira está deprecated. Tem realmente certeza que você vai manter o código assim? Você está resolvendo um problema trivial de datas e é provável que calculos mais complexos do que esse vão surgir no seu sistema.

Por isso, gaste alguns minutos para aprender o Joda-Time que sugeri ali em cima, e poupe si mesmo de muita dor de cabeça.

F

Meu Deuuuss…o cara parece que tá ignorando os posts hahaha

:shock:

R

ta bom entaum… vou fazer conforme vcs me indicaram. Muito obrigado pela atenção de vcs e eu naum ignorei o que vcs me indicaram, eu achei esse metodo pro acaso na net , e como ele atendeu minhas expectativas eu achei que estaria certo,pois até agora eu nunca trabalhei com data. :oops:

A

cuidado para nao “googlamar” ao invez de programar… tem muita gente q começa assim e depois nao sabe nem o q ta fazendo, apenas copiando codigo pronto da internet…

abraco!

R

Pode cre… agora estou estudando o gregorian calendar, depois que eu acabar eu posto o que eu fiz, para ver se ficou correto… até agora estou entendendo. vlw

R

Entaum… to tentando comparar o mes atual com o dia do vencimento que vem do banco de dados. Fiz desta forma:
Mas quando eu rodo meu programa me mostra que todos os resultados são diferentes, mas, isso não é verdade, exitem registros com o mesmo mes= ao de hoje. pex: vencimento = 11/01/2008 e data_atual 16/01/2009, os meses são iguais.

Calendar cal_atual = new GregorianCalendar();
Calendar cal_venc = new GregorianCalendar();


int mes_at;
int mes_vt;

cal_atual.setTime(data_atual);
cal_venc.setTime(B1.OPCH.getDate("data_venc"));

 if(cal_venc.equals(mes_at)){
 System.out.print("iguais");
						
}else{
						
System.out.print("diferentes");
}
T

Cuidado - há uma sutileza aqui. Quando você puxa uma data do banco e compara com a data atual (por exemplo), pode ser que o dia, mês e ano sejam os mesmos, mas a hora, minuto e segundo sejam diferentes, o que provoca o retorno de “equals” como false em vez de true.

Se for usar GregorianCalendar ou Calendar, zere os campos hora, minuto, segundo e milissegundo dos dois elementos antes de comparar, para evitar choro e ranger de dentes.

P

Pessoal como faço a seguinte operação ex: pego a data atual adiciono 15, vai dar 1 de agosto na quarta feira, pois meu cliente quer receber suas noticias somente na terça e de 15 em 15 dias então compara a minha data final, e atribuir o valor correto para próxima terça dia 31/07.
Pois quero garantir que somente a próximo disparo de newsletter seja somente na segunda após 15 dias

Grato

R

Cuidado ao reviver tópicos antigos,

não sei se nesse caso foi correto ou não, mas em todo caso, para resolver o seu problema, leia sobre o método add, da API de Calendar. Na própria documentação tem um exemplo.

P

Eu estou utilizando ele segue o código:

protected String getNextNews(String data, String periodo, String preferedDay)
    {
        cal.getTime();
        cal.add(Calendar.DATE, Integer.parseInt(periodo));         
        System.out.println(cal.getTime());       
        System.out.println(nexDate);   
        nexDate = sd.format(cal.getTime());
        return nexDate;
    }

só que eu não sei como fazer para corrigir esta data para a data preferida do meu cliente neste caso é a preferedDay que possui atributos como segunda, terça, etxc

R

quais são os valores que vem nos 3 argumentos desse método?

e por que data é uma String ?

P

A String data seria a data atual, mas troquei pelo cal.getTime(); ( que irá pegar a data atual), a String período vem o tempo por exemplo 15 dias, 5 dias, 1 dia, a String preferedDay vem o dia dos neswletter por exemplo segunda, terça, quarta.

R

ta, somar o período você já consegue fazer facilmente com Calendar, agora o que você quer fazer com essa variável preferedDay ?

P

Supondo que eu somei e bele, eu tenho um método que me traz o dia da semana eu envio a data e ele me retorna se é quarta, quinta, segunda, eu necessito fazer uma cálculo por ex: 01/08 quarta, preferedDay = segunda
[code]
cal.add(Calendar.DATE, -2);
[quote]

Mas de uma forma mais automatizada sem ficar em um monte de if else;

Obrigado

P

Ops corrigindo

cal.add(Calendar.DATE, Integer.parseInt(periodo)-2);
R

você pode fazer uma POG, né…

você consegue saber o índice do dia da semana pela variával Calendar.DAY_OF_WEEK, pode fazer um método que retorne o nome do dia, no padrão que você usa o preferedDay e comparar…

P

Então o meu problema é como fazer essa POG.

P

Rodrigo obrigado pela sua paciência, consegui fazer e está funcionando. muito obrigado

Criado 14 de janeiro de 2009
Ultima resposta 17 de jul. de 2012
Respostas 28
Participantes 9