Como comparar datas

27 respostas
A

Amigos,

Tenho uma variável string cujo conteúdo representa uma data no formato “AAAAMMDD” e preciso fazer uma comparação com outra variável string.

Por exemplo, preciso comparar se a data contida na string A é posterior à data contida na string B mais um dia.

B = “20120331” (data 31/03/2012); preciso saber se A é posterior a “20120401” (data 01/04/2012).

Podem ajudar?

27 Respostas

E

converte ela pra Date e usa o metodo para comparar compareTo

A

Desculpe-me, mas você pode dar um exemplo?
Grato.

nel

andredf:
Amigos,

Tenho uma variável string cujo conteúdo representa uma data no formato “AAAAMMDD” e preciso fazer uma comparação com outra variável string.

Por exemplo, preciso comparar se a data contida na string A é posterior à data contida na string B mais um dia.

B = “20120331” (data 31/03/2012); preciso saber se A é posterior a “20120401” (data 01/04/2012).

Podem ajudar?

Então, tem a API Joda Time que é bem conhecida e utilizada, torna mais “simples” a manipulação de datas. Se quiser bibliotecas nativas do Java, use o Calendar. Podes manipular a data com ele e obter o resultado que deseja.

nel

Não é tão simples assim não colega.

E

procura primeiro no google como transformar string to date, vai achar um post do guj, converte as 2 strings

*SimpleDateFormat

depois vc pegas as 2 datas

data1.compareTo(date2)

simples

E

respondendo ao colega
sim, é muito simples

Diego_Adriano
public boolean verificavencimento(Date emissao, Date vencimento){
		
	boolean data;
	if (emissao.before(vencimento)){
		
		data = true;
	}
	else if (emissao.after(vencimento))
		data = false;
	else
		data = true;
	
	return data;
}
pmlm

Não é tão simples assim não colega.

Não? Para o caso concreto até é melhor o after, mas poderia usar o compareTo.

String a = "20120401";
        String b = "20120331";

        DateFormat df = new SimpleDateFormat("yyyyMMdd");

        //Converte para Date
        Date dateA = df.parse(a);
        Date dateB = df.parse(b);

        //Adiciona 1 dia a B
        Calendar calB = Calendar.getInstance();
        calB.setTime(dateB);
        calB.add(Calendar.DAY_OF_MONTH, 1);
        dateB = calB.getTime();

        //Compara
        System.out.println("A depois de B+1? " + dateA.after(dateB));
nel

eduJava:
respondendo ao colega
sim, é muito simples

Ok, não vou nem sequer entrar em discussão. Só te digo que a manipulação de datas em java é tão precária que foi levantada a hipótese de adicionar o Joda Time como nativo do JDK e foi aberto uma task na lista de discussão do Java tratando exclusivamente do assunto . Depois, em casa, com tempo, procuro a task e posto aqui.

CyberX

Other Sample.

public static void main(String[] args) throws ParseException {
		String a = "20120401";
		String b = "20120331";
		
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		Date data1 = new Date(format.parse(a).getTime());
		Date data2 = new Date(format.parse(b).getTime());
		
		if(data1.after(data2)){
			System.out.println("Data: " + a + " é posterior à " + b);
		}else if(data1.before(data2)){
			System.out.println("Data: " + a + " é inferior à " + b);
		}else{
			System.out.println("Data: " + a + " é igual à " + b);
		}
	}
A

Via de regra, você deve usar as classes para manipulação de datas para esse tipo de cálculo.

Para este caso, como a data está no formato AAAAMMDD, você pode simplesmente transformar a string em long.
O maior valor será posterior.

nel

Não é tão simples assim não colega.

Não? Para o caso concreto até é melhor o after, mas poderia usar o compareTo.

String a = "20120401";
        String b = "20120331";

        DateFormat df = new SimpleDateFormat("yyyyMMdd");

        //Converte para Date
        Date dateA = df.parse(a);
        Date dateB = df.parse(b);

        //Adiciona 1 dia a B
        Calendar calB = Calendar.getInstance();
        calB.setTime(dateB);
        calB.add(Calendar.DAY_OF_MONTH, 1);
        dateB = calB.getTime();

        //Compara
        System.out.println("A depois de B+1? " + dateA.after(dateB));

Para esse caso sim, concordo . Se ele quiser ver somente se uma data é antes ou depois, ok, use assim, me refiro que a manipulação de datas no Java não é algo trivial, só isso.

A

AbelBueno:
Via de regra, você deve usar as classes para manipulação de datas para esse tipo de cálculo.

Para este caso, como a data está no formato AAAAMMDD, você pode simplesmente transformar a string em long.
O maior valor será posterior.

Neste caso, o problema é que eu preciso acrescentar um ou mais dias em uma das datas e aí o cálculo dá errado.
Por exemplo, supondo que a variável B tenha o conteúdo “20120331”. Transformando-a em long seria 20120331.
Eu preciso saber se a data contida na variável A é posterior à data B mais um dia. Como?

A

Não é tão simples assim não colega.

Não? Para o caso concreto até é melhor o after, mas poderia usar o compareTo.

String a = "20120401";
        String b = "20120331";

        DateFormat df = new SimpleDateFormat("yyyyMMdd");

        //Converte para Date
        Date dateA = df.parse(a);
        Date dateB = df.parse(b);

        //Adiciona 1 dia a B
        Calendar calB = Calendar.getInstance();
        calB.setTime(dateB);
        calB.add(Calendar.DAY_OF_MONTH, 1);
        dateB = calB.getTime();

        //Compara
        System.out.println("A depois de B+1? " + dateA.after(dateB));

Parece que o melhor caminho é esse.

Em calB.add(Calendar.DAY_OF_MONTH, 1) eu estou acrescentando um dia à data calB?

E

Para esse caso sim, concordo

o cara ta querendo aprender um negócio simples e vc(nel) ja vem com um turbilhao de coisa e falando q não é fácil e tal, algo de 3 linhas
pra um cara q tem quase 3 mil msgs, acho que não precisa disso neh :wink:

eliangela

andredf:
AbelBueno:
Via de regra, você deve usar as classes para manipulação de datas para esse tipo de cálculo.

Para este caso, como a data está no formato AAAAMMDD, você pode simplesmente transformar a string em long.
O maior valor será posterior.

Neste caso, o problema é que eu preciso acrescentar um ou mais dias em uma das datas e aí o cálculo dá errado.
Por exemplo, supondo que a variável B tenha o conteúdo "20120331". Transformando-a em long seria 20120331.
Eu preciso saber se a data contida na variável A é posterior à data B mais um dia. Como?

Olá, André!
Pra vc comparar datas é só fazer como foi sugerido. Se vc transformar a data (YYYYMMDD) em long funciona assim:

String data1 = "20120331";
String data2 = "20120401";

if (Long.parseLong(data1) > Long.parseLong(data2)) {
    System.out.println("Data 1 é maior");
} else if (Long.parseLong(data1) < Long.parseLong(data2)) {
    System.out.println("Data 2 é maior");
} else {
    System.out.println("São iguais");
}

Agora, se vc quiser fazer cálculos com datas, acredito que se vc usar a classe GregorianCalendar vai funcionar.
Ex.:

int year = 2012;
int month = 3;
int day = 31;
GregorianCalendar g = new GregorianCalendar(year, month, day);
g.add(Calendar.DAY, 1); //adiciona 1 dia ao GregorianCalendar
System.out.println(g.get(Calendar.DAY));

Espero ter ajudado!

A

eliangela:
andredf:
AbelBueno:
Via de regra, você deve usar as classes para manipulação de datas para esse tipo de cálculo.

Para este caso, como a data está no formato AAAAMMDD, você pode simplesmente transformar a string em long.
O maior valor será posterior.

Neste caso, o problema é que eu preciso acrescentar um ou mais dias em uma das datas e aí o cálculo dá errado.
Por exemplo, supondo que a variável B tenha o conteúdo "20120331". Transformando-a em long seria 20120331.
Eu preciso saber se a data contida na variável A é posterior à data B mais um dia. Como?

Olá, André!
Pra vc comparar datas é só fazer como foi sugerido. Se vc transformar a data (YYYYMMDD) em long funciona assim:

String data1 = "20120331";
String data2 = "20120401";

if (Long.parseLong(data1) > Long.parseLong(data2)) {
    System.out.println("Data 1 é maior");
} else if (Long.parseLong(data1) < Long.parseLong(data2)) {
    System.out.println("Data 2 é maior");
} else {
    System.out.println("São iguais");
}

Cara eliangela, para o meu propósito, transformar as datas em long não funciona, pois quase sempre preciso comparar uma das datas com a outra data acrescentando ao menos um dia.
Se eu somar 1 à variável long com conteúdo 20120331, o seu conteúdo mudará para 20120332 e não para 20120401 (primeiro dia do mês seguinte), como seria o desejado.


Agora, se vc quiser fazer cálculos com datas, acredito que se vc usar a classe GregorianCalendar vai funcionar.
Ex.:

int year = 2012;
int month = 3;
int day = 31;
GregorianCalendar g = new GregorianCalendar(year, month, day);
g.add(Calendar.DAY, 1); //adiciona 1 dia ao GregorianCalendar
System.out.println(g.get(Calendar.DAY));

Talvez esse sim funcione, mas precisarei “quebrar” a data que consta numa variável string (no formato AAAAMMDD) em três partes.

Obrigado a todos que estão me ajudando.

Espero ter ajudado!

adriano_si

Andre, você já sabe converter String para data ??? (1)

Se não, aprenda isso primeiro. Com a variável do tipo Date em mãos, passamos para a próxima etapa, que é calcular + 1 na data B (2). Com esse cálculo efetuado, você pode usar os métodos before() e after() de Date pra saber se uma data é anterior ou posterior a outra (3).

Todos os 3 passos você pode achar no Google de forma isoladas. O importante nesse caso é você separar responsabilidades de forma que seus métodos possam ser utilizados posteriormente para outros fins.

Eu criaria uma classe DateUtils só para realizar cada 1 dos passos de forma que um método que faz exatamente o que você quer, reaproveitando os 3 passos e passando as 2 datas, seria meu primeiro pensamento. Poderia mudar isso depois em um posterior refactor, mas em um primeiro momento seguiria essa linha de raciocínio.

Abs [] e qualquer dúvida, posta aí.

A

adriano_si:
Andre, você já sabe converter String para data ??? (1)

Se não, aprenda isso primeiro. Com a variável do tipo Date em mãos, passamos para a próxima etapa, que é calcular + 1 na data B (2). Com esse cálculo efetuado, você pode usar os métodos before() e after() de Date pra saber se uma data é anterior ou posterior a outra (3).

Todos os 3 passos você pode achar no Google de forma isoladas. O importante nesse caso é você separar responsabilidades de forma que seus métodos possam ser utilizados posteriormente para outros fins.

Eu criaria uma classe DateUtils só para realizar cada 1 dos passos de forma que um método que faz exatamente o que você quer, reaproveitando os 3 passos e passando as 2 datas, seria meu primeiro pensamento. Poderia mudar isso depois em um posterior refactor, mas em um primeiro momento seguiria essa linha de raciocínio.

Abs [] e qualquer dúvida, posta aí.

Olá, adriano.
Eu consegui converter a string para date e consegui também efetuar o acréscimo de um dia e fazer a comparação.
Está funcionando como o esperado.
Agora, porém, há outra dúvida.
Há uma data inicial (DI) e uma data final (DF).
A data final é acrescida de um dia. Ok! Com a ajuda dos colegas neste tópico, isso já está sendo feito com o método add. Portanto fazer DF + 1 é tranquilo.

Há uma terceira data (DT) que precisa ser verificada se está no período compreendido entre a (DI - 1) e (DF + 1).
A dúvida é como diminuir em 1 dia a data inicial, ou seja, como fazer (DI - 1)?
Há algum método que diminua uma data em X dias passados como parâmetro?

Rodrigo_Sasaki
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -1);
A

digaoneves:
Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, -1);

Se é simples assim, maravilha!
Fechou!
Vou testar.

G

pode usar o date assim tb.

final static int miliSegsPorDia = 1000 * 60 * 60 * 24;
    
    public static Date IncDay(Date d, int dias){
    	return new Date(d.getTime() + miliSegsPorDia * dias);
    }

exemplo de uso:

date = format.parse("20120331");

    Date date2 = IncDay(date, 1);
adriano_si

andredf:
digaoneves:
Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, -1);

Se é simples assim, maravilha!
Fechou!
Vou testar.

Opa Andre, parece que conseguiu resolver. Entenda que oi addCalendar() da classe calendar, como próprio nome diz, adiciona o valor do segundo parametro Ao objeto de onde ele está sendo chamado.

Logo a matemática é fácil e simples, basta fazer o jogo de sinais. Qualquer valor positivo somado a um negativo fará você inverter o sinal.

Quando dizemos 2 + (-1) é a mesma coisa que dizer 2 - 1.

Abs []

giuliasousa

Andre, é bom que você dê uma olhada na documentação da classe Calendar, pois eles podem gerar uma certa confusão pelo fato de vc ter que passar uma constante e um valor, inicialmente eu fiquei boiando um pouco sem ler a documentação.

Porém como nosso amigo disse tem também a JodaTime que é ótima pra manipular datas.

#ficadica

A

giuliasousa:
Andre, é bom que você dê uma olhada na documentação da classe Calendar, pois eles podem gerar uma certa confusão pelo fato de vc ter que passar uma constante e um valor, inicialmente eu fiquei boiando um pouco sem ler a documentação.

Porém como nosso amigo disse tem também a JodaTime que é ótima pra manipular datas.

#ficadica

Testei como sugerido pelos amigos aqui do fórum e está funcionando a contento.

Obrigado a todos. Podem fechar o tópico.

giulia, você é realmente gatinha assim como na foto?

A

Ah desculpe, não tinha lido essa parte de adicionar um dia.

eliangela

andredf:
digaoneves:
Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, -1);

Se é simples assim, maravilha!
Fechou!
Vou testar.

Foi mais ou menos a sugestão que eu dei acima… só que eu sugeri o GregorianCalendar.

Criado 18 de abril de 2012
Ultima resposta 20 de abr. de 2012
Respostas 27
Participantes 12