Mostrar quantos dias faltam para se realizar uma tarefa mediante a duas datas

Boa tarde pessoal!

Estou desenvolvendo uma aplicação que agenda manutenção de aparelhos eletrodomésticos,
e eu gravo a data inicial (do sistema) e a data da próxima manutenção. Já tenho um método que calcula a diferença das datas e armazena o resultado em um campo “periodicidade” .

Preciso que quando acessar a página da lista de manutenções o sistema que mostre quantos dias faltam para chegar data da próxima manutenção.

NA BEAN :

public List<GsManutencaoPreventiva> getListarManutencaoPendentesAndamentos() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        
        List<GsManutencaoPreventiva> gmps= gsManutencaoPreventivaFacade.getManutencaoPendenteAndamento();
        int i = 0;

        for (GsManutencaoPreventiva ptBem : gsManutencaoPreventivaFacade.getManutencaoPendenteAndamento()) {
            try {
                Date dataManutencao1 = df.parse(df.format(ptBem.getDataManutencao()));
                Date dataManutencaoProxima = df.parse(df.format(ptBem.getDataProximaManutencao()));
                long dias = (dataManutencaoProxima.getTime() - dataManutencao1.getTime()) / (1000*60*60*24);
                ptBem.setPeriodicidade((int)dias);
                gmps.set(i, ptBem);
                
                i++;
            } catch (ParseException ex) {
                Logger.getLogger(ManutencaoPreventivaBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return gmps;
    }

E na pagina eu mostro o resultado num datatable do jsf :

<p:dataTable rendered="#{manutencaoPreventivaBean.tabListar}" id="tabela" var="preventiva" value="#{manutencaoPreventivaBean.listarManutencaoPendentes}" paginatorAlwaysVisible="false"
                                     paginator="true"  paginatorPosition="bottom" rows="5" emptyMessage="Não há registros!"
                                     rowStyleClass="#{preventiva.idEstadoGsEstado.descricaoEstado eq 'Pendente'? 'laranja': preventiva.idEstadoGsEstado.descricaoEstado eq 'Concluido' ? 'normal' : null}">
                            <f:facet name="header">
                                <label style="font-size:140% ">Visualização dos Registros - Manutencao Preventiva</label> 
                            </f:facet>

                            <p:column headerText="Data de Manutencao" style="text-align:center"  >
                                <h:outputText value="#{preventiva.dataManutencao}" >
                                    <f:convertDateTime pattern="dd-MM-yyyy" timeZone="GMT+1"/>
                                </h:outputText>
                            </p:column>

                            <p:column headerText="Data da Proxima Manutencao" style="text-align:center"  >
                                <h:outputText value="#{preventiva.dataProximaManutencao}" >
                                    <f:convertDateTime pattern="dd-MM-yyyy" timeZone="GMT+1"/>
                                </h:outputText>
                            </p:column>

                            <p:column headerText="Estado" style="text-align:center"  >
                                <h:outputText value="#{preventiva.idEstadoGsEstado.descricaoEstado}"/>
                            </p:column>



                            <p:column headerText="Equipamento" style="text-align:center"  >
                                <h:outputText value="#{preventiva.idBem.descricaobem}" />
                            </p:column>

                            <p:column headerText="Fornecedor" style="text-align:center"  >
                                <h:outputText value="#{preventiva.idDocumento.descricaodocumento}" />
                              </p:column>  
                            
                             <p:column headerText="Tempo de Expiracao" style="text-align:center"  >
                                 <h:outputText value="#{preventiva.periodicidade}" />
                              </p:column> 


                            <p:column headerText="Alterar" style="width: 100px;">
                                <p:commandButton style="margin-left:30%;" icon="ui-icon-edit" update="@form" action="#{manutencaoPreventivaBean.alterar(preventiva)}"> 

                                    <p:confirm header="Confirmação" message="Desejas realmente alterar a manutencao agendada para a data #{preventiva.dataManutencao}  ?" icon="ui-icon-warning" />
                                </p:commandButton>
                                <p:confirmDialog global="true" showEffect="fade" hideEffect="fade" width="350">
                                    <p:commandButton value="Sim" type="button" styleClass="ui-confirmdialog-yes GreenButton" icon="ui-icon-check" />
                                    <p:commandButton value="Não" type="button"  styleClass="ui-confirmdialog-no RedButton" icon="ui-icon-close" />
                                </p:confirmDialog>
                            </p:column>

                        
                        </p:dataTable>

Desde já agradeço , toda ajuda é benvinda.

1 curtida

Obtenha os milisegundos que representam cada data, subtraia o menor do maior e a partir disso calcule a quantidade de dias, ou seja, divida a diferença por 86.400.000, pois: 1 segundo possui 1000 milisegundos, 1 minuto possui 60 segundos, 60.000 milisegundos, uma hora possui 60 minutos, 3.600.000 milisegundos, um dia possui 24 horas, 86.400.000 milisegundos.

[]'s

1 curtida

Oi @davidbuzatto valeww :smile: fiz desta da seguinte forma :

List gmps= gsManutencaoPreventivaFacade.getManutencaoPendenteAndamento();
int i = 0;

    for (GsManutencaoPreventiva ptBem : gsManutencaoPreventivaFacade.getManutencaoPendenteAndamento()) {
        try {
            Date dataManutencao1 = df.parse(df.format(ptBem.getDataManutencao()));
            Date dataManutencaoProxima = df.parse(df.format(ptBem.getDataProximaManutencao()));
            long dias = (dataManutencaoProxima.getTime() - dataManutencao1.getTime()) / (1000*60*60*24);
            ptBem.setPeriodicidade((int)dias);
            gmps.set(i, ptBem);
            
            i++;
        } catch (ParseException ex) {
            Logger.getLogger(ManutencaoPreventivaBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    return gmps;

Funciona, ele mostra no datatable o resultado da diferença em dias.

Mas queria que o resultado da diferença em dias fosse decrementando diariamente. Da forma que tá no datatable mostra todos os dias o mesmo valor.

Tem como resolver isso ?

Em vez de usar as duas datas, a inicial e a de manutenção, utilize apenas a de manutenção e subtraia a data de hoje, assim você vai ter os dias decrescentes

1 curtida

@Rodrigomarden vou testar depois irei postar como ficou.
Obrigada !

1 curtida

"
@Rodrigomarden resolvido, obrigada !

Date dataManutencao1 = new Date();

@Giza2012 já sei que foi resolvido, só estou aqui para dar uma dica, o Java 8 trouxe uma nova Api de data para se trabalhar as que mais uso são LocalDate e Period veja um exemplo que fiz:

public static void main(String[] args){
/*Retorna um localdate com a data atual*/
        LocalDate data_do_sistema = LocalDate.now();
        /*Data do sistema*/
        System.out.println("Data atual do sistema: " + data_do_sistema.toString());

        /*Retorna um localDate com a data que vc mesmo passa*/
        LocalDate proxima_data = LocalDate.of(2017, Month.JUNE, 25);
        /*mesma coisa mas agora estou passando em forma de String*/
        LocalDate proxima_data_form = LocalDate.parse("2017-06-25");

        System.out.println("Data usando o LocalDate.of(): " + proxima_data.toString());
        System.out.println("Data usando o LocalDate.parse(): " + proxima_data_form);

        /*tem um classe pronta para descobrir quantos dias falta, meses entre outras funçoes
        Aqui ela faz o calculo sozinho, quanto tempo falta ENTRE(between) uma data e outra
         */
        Period periodo = Period.between(data_do_sistema, proxima_data);

        System.out.println("Data do Sistema é: " + data_do_sistema.toString() + " e a próxima data é: " + proxima_data);
        System.out.println("Falta " + periodo.getDays() + " Dias e " + periodo.getMonths() + " meses para a próxima data");

}

O que é mostrado no console após executar:

Data atual do sistema: 2017-04-28
Data usando o LocalDate.of(): 2017-06-25
Data usando o LocalDate.parse(): 2017-06-25
Data do Sistema é: 2017-04-28 e a próxima data é: 2017-06-25
Falta 28 Dias e 1 meses para a próxima data

Se tiver interesse veja:

2 curtidas

Obrigada @Jeanderson_Silva ,

por acaso já tinha pesquisado sobre essa API e o JODATIME,
infelizmente tive que buscar esse “método das cavernas” porque este projecto é académico e é obrigatório
o uso do JAVA 7 :frowning:

1 curtida

Entendi kkkk mas é bom q tu sabe mexer com os Java mais antigo, no ministério estavam usando Java 5