Consultar objetos pela data

17 respostas Resolvido
datejavamysql
A

bom dia! como consulto objetos em uma lista pela data?

333343

17 Respostas

D

Poderia ajudar colocando o código dessa lista!

A
Solucao aceita
public class TesteMain {

@SuppressWarnings("deprecation")
public static void main(String[] args) {
	
	List<Pessoa> pessoas = new ArrayList<>();

	Pessoa p1 = new Pessoa();
	p1.setNome("Alex");
	p1.setData_nasc(stringParaData("1988/06/07"));		
	pessoas.add(p1);
	
	Pessoa p2 = new Pessoa();		
	p2.setNome("Maria");
	p2.setData_nasc(stringParaData("1991/05/12"));	
	pessoas.add(p2);
	
	Pessoa p3 = new Pessoa();		
	p3.setNome("Joao");
	p3.setData_nasc(stringParaData("1970/07/16"));			
	pessoas.add(p3);
	
	Pessoa p4 = new Pessoa();		
	p4.setNome("Jose");
	p4.setData_nasc(stringParaData("1981/09/06"));		
	pessoas.add(p4);
	
	Pessoa p5 = new Pessoa();		
	p5.setNome("Paulo");
	p5.setData_nasc(stringParaData("1998/07/16"));		
	pessoas.add(p5);
	
	pessoas.forEach(x -> System.out.println(x));

}

public static class Pessoa {

	private String nome;
	private Date data_nasc;		



	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getData_nasc() {
		return data_nasc;
	}

	public void setData_nasc(Date data_nasc) {
		this.data_nasc = data_nasc;
	}

	@Override
	public String toString() {
		return "Pessoa [nome=" + nome + ", data_nasc=" + data_nasc + "]";
	}	

}

}
D

Dessa forma tem um resultado favorável para consulta de data:

Date d = stringParaData("1998/07/16");
List<Pessoa> collect = pessoas.stream()
                .filter(f -> f.getData_nasc() != null && f.getData_nasc().equals(d))
                .collect(Collectors.toList());
                
        
 collect.forEach(x -> System.out.println(x));

Exemplo prático:

A

Oi Dragoon! muito obrigado, esta sendo de grande ajuda, mas no caso eu gostaria de pegar o aniversariante do dia, como eu faria a consulta apenas pelo dia e e mes da data_nasc?

D

Crie uma função da seguinte assinatura:

public static Boolean getDayAndMonth(Date dt0, GregorianCalendar gregorianCalendar){
    if (dt0 == null) return false;
    GregorianCalendar getInfoDate = gregorianCalendar;
    getInfoDate.setTime(dt0);
    int d0 = getInfoDate.get(Calendar.DAY_OF_MONTH);
    int m0 = getInfoDate.get(Calendar.MONTH);
    getInfoDate.setTime(new Date());
    int d1 = getInfoDate.get(Calendar.DAY_OF_MONTH);
    int m1 = getInfoDate.get(Calendar.MONTH);
    return (d0 == d1 && m0 == m1);
}

Essa função pega a data atual e a data do paramento e compara mês e ano se for igual retornada um dado boleano verdadeiro ou falso se for ao contrário e como utilizar?

Dessa forma no código anterior:

GregorianCalendar gregorianCalendar = new GregorianCalendar(); 
List<Pessoa> collect = pessoas.stream()
            .filter(f -> getDayAndMonth(f.getData_nasc(), gregorianCalendar))
            .collect(Collectors.toList());
            
    
collect.forEach(x -> System.out.println(x.getData_nasc()));

A

Obrigado, esse lance de trabalhar com datas esta me deixando um pouco confuso, eu so consigo trabalhar com dia, mes separadamente se eu utilizar a Classe Calendar? a classe Date nao conseue fracionar essa informaçao?

D

Se for verificar esses métodos estão obsoletos!

A

estão mesmo.

A

Oi Dragoon, estou estudando um pouco sobre o tema, fazendo alguns testes, pq o mes esta saindo 6? quando deveria sair 7 ?

O

@Alexsandro_Andrade nessa api calendários são um array logo Janeiro = 0;

O

E respondendo o topico tenta usar java.time.LocalDate para fazer isso?

A

LocalDate tem algum método que posso consultar pelo dia e mes do Date?

O
LocalDate teste = LocalDate.parse("2018-01-01", DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(teste.getMonthValue());
System.out.println(teste.getDayOfMonth());

(você muda o formatter para trocar o método de entrada)

D

Como foi explicado a você, janeiro é 0, fevereiro é 1 e assim por diante, coisas de Java e suas API. O amigo lhe passou um LocalDate teste ai e deixei como comentário e até código é bom deixar os estudos aqui também.

Só lembrando que a lógica de pesquisa é a mesma só o código talvez precisa ser refatorado!

A

obrigado, vou continuar estudando, em breve compartilho o código

A

Obrigado Pela ajuda @Dragoon e @Ofidomundo assim

@Test
public void listarComunicados() throws ParseException {
	funcionariosList = funcionarioService.findAll();
	funcionariosList.forEach(x -> System.out.println("lista - " + x));
	
	aniverList = funcionariosList.stream().filter(f -> getDayAndMonth(f.getData_nasc()))
			.collect(Collectors.toList());
	aniverList.forEach(x -> System.out.println("agora vai - " + x));

}

public static Boolean getDayAndMonth(Date dt0) {
	if (dt0 == null) {
		return false;
	}
	//GregorianCalendar getInfoDate = gregorianCalendar;
	GregorianCalendar gregorianCalendar = new GregorianCalendar();
	gregorianCalendar.setTime(dt0);
	int d0 = gregorianCalendar.get(Calendar.DAY_OF_MONTH);
	int m0 = gregorianCalendar.get(Calendar.MONTH);
	gregorianCalendar.setTime(new Date());
	int d1 = gregorianCalendar.get(Calendar.DAY_OF_MONTH);
	int m1 = gregorianCalendar.get(Calendar.MONTH);
	return (d0 == d1 && m0 == m1);
}
A

dessa formar eu consigo consultar os aniversariantes do dia :slight_smile: muito obrigado!

Criado 22 de julho de 2018
Ultima resposta 23 de jul. de 2018
Respostas 17
Participantes 3