Como comparar datas

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?

converte ela pra Date e usa o metodo para comparar compareTo

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

[quote=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?

[/quote]

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.

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

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

1 curtida

respondendo ao colega
sim, é muito simples

2 curtidas

[code]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;

}
[/code]

2 curtidas

Não é tão simples assim não colega.[/quote]

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));

[quote=eduJava]respondendo ao colega
sim, é muito simples[/quote]

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.

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);
		}
	}

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.

Não é tão simples assim não colega.[/quote]

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));

[/quote]

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.

[quote=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.[/quote]

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?

Não é tão simples assim não colega.[/quote]

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));

[/quote]

Parece que o melhor caminho é esse.

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

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:

[quote=andredf][quote=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.[/quote]

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?
[/quote]

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!

[quote=eliangela][quote=andredf][quote=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.[/quote]

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?
[/quote]

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");
}

[/quote]

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.

[quote]
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![/quote]

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í.

[quote=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í.[/quote]

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?