Manipulação de datas sem funções JAVA

Java

10/11/2015

Boa noite pessoal,

Sou estudante de programação e recebi um desafio na cadeira de Algoritmos onde devo calcular a diferença entre datas no formato dd/mm/aaaa, porém sem usar nenhuma função do JAVA como Date, Calendar etc., posso só usa o Scanner. O problema maior é os anos bissextos. Por gentileza, alguém pode me ajudar?
Ismael

Ismael

Curtidas 0

Melhor post

Ismael

Ismael

06/12/2015

Abaixo o trabalho pronto...

package trabalho.datas;

import java.util.Scanner;

class TrabalhoDatas {

    public static void main(String[] args) throws java.lang.Exception {

        int dia_inicio, mes_inicio, ano_inicio, dia_fim, mes_fim, ano_fim;
        int ano, mes, dia;
        int intervalo[], dias_do_mes, dia_do_mes1, dia_do_mes2;
        int cont_dia = 0, cont_mes = 0, cont_ano = 0;

        /* meses do ano = não importa quantos dias o mês possui, o importante é passar o intervalo 
        correto de todo mes, ano e somar cada um deles no fim do mesmo*/
        intervalo = new int[13];
        intervalo[1] = 31;
        intervalo[2] = 28;
        intervalo[3] = 31;
        intervalo[4] = 30;
        intervalo[5] = 31;
        intervalo[6] = 30;
        intervalo[7] = 31;
        intervalo[8] = 31;
        intervalo[9] = 30;
        intervalo[10] = 31;
        intervalo[11] = 30;
        intervalo[12] = 31;

        /* abaixo entrada de dados pelo usuário "obrigatório nesse formato, senão
        o algoritmo não rodará e dará bug */
        String resulta1 = "", resulta2 = "", resulta3 = "";
        Scanner entrada = new Scanner(System.in);
        System.out.println("Digite a data inicial no formato dd/mm/aaaa: ");
        String data_inicio[] = entrada.next().split("\\/");
        dia_inicio = Integer.parseInt(data_inicio[0]);
        mes_inicio = Integer.parseInt(data_inicio[1]);
        ano_inicio = Integer.parseInt(data_inicio[2]);
        System.out.println("Digite a data final no formato dd/mm/aaaa: ");
        String data_fim[] = entrada.next().split("\\/");
        dia_fim = Integer.parseInt(data_fim[0]);
        mes_fim = Integer.parseInt(data_fim[1]);
        ano_fim = Integer.parseInt(data_fim[2]);

        /* abaixo calculo do ano se é bissexto ou não segundo calendario gregoriano 
        Fonte: https://pt.wikipedia.org/wiki/Ano_bissexto */
        if (mes_inicio == 2) {
            if ((ano_inicio % 400 == 0) || ((ano_inicio % 4 == 0) && (ano_inicio % 100 != 0))) {
                dia_do_mes1 = 29;
            } else {
                dia_do_mes1 = 28;
            }
        } else {
            dia_do_mes1 = intervalo[mes_inicio];
        }
        if (mes_fim == 2) {
            if ((ano_fim % 400 == 0) || ((ano_fim % 4 == 0) && (ano_fim % 100 != 0))) {
                dia_do_mes2 = 29;
            } else {
                dia_do_mes2 = 28;
            }
        } else {
            dia_do_mes2 = intervalo[mes_fim];
        }
        
        //abaixo ele processa a entrada de dados e se negativos gera um comentário de bug
        if (ano_fim < ano_inicio
                || (ano_fim == ano_inicio && mes_fim < mes_inicio)
                || (ano_fim == ano_inicio && mes_fim == mes_inicio && dia_fim < dia_inicio)
                || (dia_inicio > dia_do_mes1 || dia_fim > dia_do_mes2)
                || (dia_inicio < 0 || dia_fim < 0 || mes_inicio < 0 || mes_fim < 0 || ano_inicio < 0 || ano_fim < 0)) {
            System.out.println("BUG  -  Favor retornar com uma data válida!");
        } else {
            
            //abaixo inicio da contagem da diferença de datas
            ano = ano_inicio;
            mes = mes_inicio;
            dia = dia_inicio;
            while (!(ano == ano_fim && mes == mes_fim && dia == dia_fim)) {
                if (mes == 2) {
                    if ((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))) {
                        dias_do_mes = 29;
                    } else {
                        dias_do_mes = 28;
                    }
                } else {
                    dias_do_mes = intervalo[mes];
                }
                
                // abaixo começa contando os dias, meses e anos
                if ((mes == mes_fim && ano == ano_fim)
                        || (mes == mes_inicio && ano == ano_inicio)
                        && dia < dias_do_mes) {
                    cont_dia += 1;
                    dia += 1;
                } else {
                    if (dia == 31 && mes == 12) {
                        cont_dia += 1;
                        ano += 1;
                        mes = 1;
                        dia = 1;
                    } else if (dia == dias_do_mes) {
                        cont_dia += 1;
                        mes += 1;
                        dia = 1;
                    } else if (dia < dias_do_mes) {
                        cont_dia += 1;
                        dia += 1;
                    }
                }
                if ((dia_inicio <= dias_do_mes && dia_inicio == dia)
                        || (dia_inicio > dias_do_mes && dia == dias_do_mes)) {
                    cont_dia = 0;
                    cont_mes += 1;
                    if (cont_mes == 12) {
                        cont_ano += 1;
                        cont_mes = 0;
                    }
                }

            }
        }

        //aqui começa os resultados do fim do algoritmo e como aparecerá na impressão
        if (cont_ano != 0) {
            if (cont_ano == 1 && cont_dia == 0 && cont_mes == 0) {
                resulta1 = cont_ano + " ano.";
            }
            if (cont_ano == 1 && (cont_dia > 0 && cont_mes > 0)) {
                resulta1 = cont_ano + " ano, ";
            } else if (cont_ano == 1 && (cont_dia > 0 || cont_mes > 0)) {
                resulta1 = cont_ano + " ano e ";
            }
            if (cont_ano > 1 && cont_dia == 0 && cont_mes == 0) {
                resulta1 = cont_ano + " anos.";
            }
            if (cont_ano > 1 && cont_dia > 0 && cont_mes > 0) {
                resulta1 = cont_ano + " anos, ";
            } else if (cont_ano > 1 && (cont_dia > 0 || cont_mes > 0)) {
                resulta1 = cont_ano + " anos e ";
            }
        }
        if (cont_mes
                != 0) {
            if (cont_mes == 1 && cont_dia == 0) {
                resulta2 = cont_mes + " mês.";
            }
            if (cont_mes == 1 && cont_dia > 0) {
                resulta2 = cont_mes + " mês e ";
            }
            if (cont_mes > 1 && cont_dia > 0) {
                resulta2 = cont_mes + " meses e ";
            }
            if (cont_mes > 1 && cont_dia == 0) {
                resulta2 = cont_mes + " meses.";
            }
        }
        if (cont_dia
                != 0) {
            if (cont_dia == 1) {
                resulta3 = cont_dia + " dia.";
            }
            if (cont_dia > 1) {
                resulta3 = cont_dia + " dias.";
            }
        }

        //aqui somam-se os resultados e imprime na tela
        System.out.println(resulta1 + resulta2 + resulta3);//somam-se os resultados e imprime na tela
    }

}
GOSTEI 1

Mais Respostas

Marcos Paulo

Marcos Paulo

10/11/2015

Acompanhando, estudei usando essas funções.
GOSTEI 0
Ismael

Ismael

10/11/2015

Pois é Marcos, vamos aprender as funções ainda. O professor disse que ele ganhou premio na universidade por conseguir fazer esse calculo entre datas sem funções e agora quer que aprendamos, só que o cara é muito entendido. Vamos aguardar algum gênio ai no mundo virtual me ajudar. Vlw
GOSTEI 0
Marcos Paulo

Marcos Paulo

10/11/2015

Entendo a proposta do professor em motivar aos alunos para esse desafio mas nunca vi como fazer isso, que eu lembre.
GOSTEI 0
Marcos Vinicios

Marcos Vinicios

10/11/2015

Tem alguma base de como deve começar?
GOSTEI 0
Ismael

Ismael

10/11/2015

Fiz até aqui:


/*
*Aqui é a proposta do professor;
*
* Data inicial (informada pelo usuário)
* dd/mm/aaaa
* Data final (informada pelo usuário)
* dd/mm/aaaa
* Sem usar funções de data do Java
* Calcular a diferença em dias entre a data inicial e hoje:
* Considerar bissextos
* Apresentar: ex: 38 anos, 10 meses e 5 dias
*
*/
package trabalho_datas;

import java.util.Scanner;



public class Trabalho_datas {


public static void main(String[] args) {
// código

Scanner leitor = new Scanner(System.in);

int ano = leitor.nextInt();

if(ano%4!=0){
//não é bissexto
System.out.println("não é bissexto");
}else{
if(ano%100!=0){
//é bissexto
System.out.println("é bissexto");
}else{
if(ano%400==0){
//bissexto
System.out.println("é bissexto");
}else{
//não é bissexto
System.out.println("não é bissexto");
}
}
}
}

}
GOSTEI 0
Ismael

Ismael

10/11/2015

Pessoal, encontrei como calcular os bissextos. Assim:

public static void main(String[] args){

int ano = 0;
Scanner input = new Scanner(System.in);
ano = input.nextInt();

if((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))){
System.out.println(ano + " é um ano Bissexto!");
}
else{
System.out.println(ano + " não é um ano Bissexto!");
}
}


Agora, tenho que calcular quando os meses tem 31 dias, quando tem 30 dias.

Podem ajudar?
GOSTEI 0
Marcos Paulo

Marcos Paulo

10/11/2015

Estou vendo e procurando entender seu código.
GOSTEI 0
Felipe Moreira

Felipe Moreira

10/11/2015

[url]https://www.devmedia.com.br/forum/classe-calendar/535889[/url]

Não é a solução, mas se puder estudar sobre a classe calendar, eu não tenho certeza se da para visualizar internamente, pode ajudar.
GOSTEI 0
Ismael

Ismael

10/11/2015

Felipe, segundo o professor, não posso usar essa classe, ou seja, nenhuma função do Java que possa facilitar. Vai ter que ser na unha mesmo. Laços de repetição, condições etc.
GOSTEI 0
Jothaz

Jothaz

10/11/2015

Para definir quais meses tem 30 ou 31 dias, você poder usar um array pois os dados são fixos.
E depois obter o valor usando array[Mes - 1], claro que considerando o bissexto.
GOSTEI 0
Ismael

Ismael

10/11/2015

Olha só a lógica que tive analisando aqui:

variaveis
Entre com a primeira data
Escreva a primeira data
Digite a segunda data
Escreva a segunda data
Se a primeira data for a partir de 01/01/1582 então calcule
Fórmula do bissexto acima
Se for bissexto o ano tem 366 dias, senão tem 365 dias
Calcular a diferença entre a primeira data em dias, meses e anos
(logicamente terei que definir que ano 365 dias, doze meses)

Quem consegue jogar isso pra JAVA pra ver se dá certo?
GOSTEI 0
Felipe Moreira

Felipe Moreira

10/11/2015

Felipe, segundo o professor, não posso usar essa classe, ou seja, nenhuma função do Java que possa facilitar. Vai ter que ser na unha mesmo. Laços de repetição, condições etc.


Exercicio hardcore Ismael, legal a metodologia.

No enunciado da questão ou trabalho, ele da dicas de algo que possa ser utilizado ou deixou totalmente aberta essa questão?
GOSTEI 0
Ismael

Ismael

10/11/2015

É mesmo hardcore. Ai que se esconde a coruja, ele só quer que seja no formato dd/mm/aaaa e que não seja usado as funções. Parece-me que tenho colegas que já fizeram e deu certo e outros que fizeram e o algoritmo dá errado. Bem loco!
GOSTEI 0
Felipe Moreira

Felipe Moreira

10/11/2015

Não deu dica?

No enunciado da questão ou trabalho, ele da dicas de algo que possa ser utilizado ou deixou totalmente aberta essa questão?
GOSTEI 0
Ismael

Ismael

10/11/2015

É Felipe, sem dicas. Ele quer que nós façamos o que estou fazendo aqui, pesquisando, pedindo ajuda etc., cada um por si.
GOSTEI 0
Felipe Moreira

Felipe Moreira

10/11/2015

Complicado mais um pouco hein, boa sorte.
GOSTEI 0
Ismael

Ismael

10/11/2015

Tenho uma notícia boa e ruim ao mesmo tempo;

Meu código ta quase pronto, ta dando erro ainda na hora que ele troca de ano não ta acumulando, deem uma olhada e sugestões de arrumar se possível:

import java.util.Scanner;
 
class Trabalho_datas
{
	public static void main (String[] args) throws java.lang.Exception{
        // declara as variaveis usadas para armazenar as datas
        int diaInicial, mesInicial, anoInicial, diaFinal, mesFinal, anoFinal;
        // variáveis usadas no laço que percorre o período
        int ano, mes, dia;
        int meses[], diasMes, flag=0, dM=0;
        // variáveis que acumulam ou auxiliam o acúmulo do tempo passado
        int tD = 0, tM = 0, tA = 0;
        /* declara e preenche um vetor com o número de dias de cada mês */
        meses = new int[13];
        meses[1] = 31;
        meses[2] = 28;
        meses[3] = 31;
        meses[4] = 30;
        meses[5] = 31;
        meses[6] = 30;
        meses[7] = 31;
        meses[8] = 31;
        meses[9] = 30;
        meses[10] = 31;
        meses[11] = 30;
        meses[12] = 31;
        //declara e preenche (vazia) as variáveis de apresentação do processamento final
        String texto1 = "", texto2 = "", texto3 = "";
        //variavel de entrada de dados (do teclado)
        Scanner entrada = new Scanner(System.in);
        System.out.println("Digite a data inicial no formato DD/MM/AAAA: ");
        //lê e já divide a string nos campos
        String dataInicial[] = entrada.next().split("\\/");
        //a leitura é uma string, tem que converter para inteiro, para cada numero
        diaInicial = Integer.parseInt(dataInicial[0]);
        mesInicial = Integer.parseInt(dataInicial[1]);
        anoInicial = Integer.parseInt(dataInicial[2]);
        System.out.println("Digite a data final no formato DD/MM/AAAA: ");
        //mesma coisa para a data final
        String dataFinal[] = entrada.next().split("\\/");
        diaFinal = Integer.parseInt(dataFinal[0]);
        mesFinal = Integer.parseInt(dataFinal[1]);
        anoFinal = Integer.parseInt(dataFinal[2]);
/*
AINDA FALTA TESTAR SE A DATA É REALMENTE VÁLIDA:
1 - SE O ANO É BISSEXTO E A DATA INFORMADA NÃO EXISTE
2 - SE O DIA É MAIOR QUE A QUANTIDADE DE DIAS DO MÊS INFORMADO
*/
        if (anoFinal < anoInicial
                || // anos negativos
                (anoFinal == anoInicial && mesFinal < mesInicial)
                || // anos iguais, meses negativos
                (anoFinal == anoInicial && mesFinal == mesInicial && diaFinal < diaInicial))
                   // anos e meses iguais, dias negativos
        {
            System.out.println("a data final deve ser posterior a data inical...");
        } else {
            /*
             as datas são válidas, vamos percorrer o período de tempo entre
             a data inicial e a final, para isso vamos criar variáveis novas
             que integrarão o laço, assim não perdemos as iniciais.
             */
            ano = anoInicial;
            mes = mesInicial;
            dia = diaInicial;
            // enquanto não chega nos limites, vai adiante
            while (!(ano == anoFinal && mes == mesFinal && dia == diaFinal)) {
                // diasMes armazena os dias do mês
                // em que o laço está operando
                if (mes == 2) { // é fevereiro
                    if ((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))) {
                        diasMes = 29;
                    } else {
                        diasMes = 28;
                    }
                } else {
                    diasMes = meses[mes]; // qualquer outro mês
                }
                // começa contando os dias
                if ((mes == mesFinal && ano == anoFinal)
                        || (mes == mesInicial && ano == anoInicial)
                        && dia < diasMes) {
                    /*
                     se as variáveis que percorrem o período  coincidirem com o
                     mêss e ano iniciais ou finais o motivo é termos os extremos
                     do intervalo, o primeiro e último mês basta somar dias, até
                     passar para o próximo mês ou chegar no final do período.
                     */
                    tD += 1;
                    dia += 1;
                } else { // é um mês que não se encontra nos limites do intervalo
                    if (dia == diasMes) {
                        // final do mês, começa no próximo
                        tD += 1;
                        mes += 1;
                        dia = 1;
                        flag = 1;
                    }
                    else if (dia < diasMes) {
                        // meio do mês, vai somando
                        tD += 1;
                        dia += 1;
                    }
                    if (dia == 31 && mes == 12) {
                        // fim de ano, nothing changes on new years day
                        // exceto o ano, mês e dia no algoritmo
                        tD += 1;
                        ano += 1;
                        mes = 1;
                        dia = 1;
                        flag = 1;
                    }
                }
                /*
                 Um mês equivale ao tempo entre um dia de determinado mês e o
                 mesmo dia no próximo mês. A não ser que o dia não exista no
                 próximo mês, o que significa que no final dele, já dá um mês.
                 */
                if (mes == 3) { // março, retorna fevereiro
                    if ((ano % 400 == 0) || ((ano % 4 == 0) && (ano % 100 != 0))) {
                        dM = 29;
                    } else {
                        dM = 28;
                    }
                } else if(mes==1) {
                    dM = 31; // janeiro, retorna dezembro
                }else{
                    dM = meses[mes-1]; // qualquer outro mês
                }
                if (dia==diaInicial){
                    /*
                    Chegou no mesmo dia no próximo mês, ou no final do mês,
                    se o dia não existir no próximo
                    */
                    tM += 1;
                    tD = 0;
                    flag=0;
                    if (tM == 12) {
                        /* acumulou 12 meses, incrementa 1 ano, zera o
                         acumulador de meses */
                        tA += 1;
                        tM = 0;
                    }
                }
                // fim do código novo
            }
        }
        /*
         aí cuidamos da existência dos valores na string final que irá para
         a tela, inclusive dos plurais, fica mais apresentável
         */
        if (tA != 0) {
            if (tA == 1 && tD == 0 && tM == 0) {
                texto1 = tA + " ano.";
            }
            if (tA == 1 && (tD > 0 && tM > 0)) {
                texto1 = tA + " ano, ";
            } else if (tA == 1 && (tD > 0 || tM > 0)) {
                texto1 = tA + " ano e ";
            }
            if (tA > 1 && tD == 0 && tM == 0) {
                texto1 = tA + " anos.";
            }
            if (tA > 1 && tD > 0 && tM > 0) {
                texto1 = tA + " anos, ";
            } else if (tA > 1 && (tD > 0 || tM > 0)) {
                texto1 = tA + " anos e ";
            }
        }
        if (tM
                != 0) {
            if (tM == 1 && tD == 0) {
                texto2 = tM + " mês.";
            }
            if (tM == 1 && tD > 0) {
                texto2 = tM + " mês e ";
            }
            if (tM > 1 && tD > 0) {
                texto2 = tM + " meses e ";
            }
            if (tM > 1 && tD == 0) {
                texto2 = tM + " meses.";
            }
        }
        if (tD
                != 0) {
            if (tD == 1) {
                texto3 = tD + " dia.";
            }
            if (tD > 1) {
                texto3 = tD + " dias.";
            }
        }
        // por fim, escreve o resultado do processamento:
        System.out.println(texto1 + texto2 + texto3);
	}
}
 
GOSTEI 0
Edson Venancio

Edson Venancio

10/11/2015

Cara entra no Youtube, no canal de AlunopraAluno , na parte de programação Java ele ensina como fazer...
GOSTEI 0
Felipe Moreira

Felipe Moreira

10/11/2015

Cara entra no Youtube, no canal de AlunopraAluno , na parte de programação Java ele ensina como fazer...


Obrigado Edson, não conhecia esse canal.
GOSTEI 0
Ismael

Ismael

10/11/2015

boa noite, é com imensa alegria que escrevo aqui que




CONSEGUIIIIIIIIIIIIIIIIIIIIIIIII!


que p... de algoritmo do c...

mas consegui!

obrigado a todos!
GOSTEI 0
Daniel

Daniel

10/11/2015

Muito bom!
Funciona mesmo!
GOSTEI 1
Felipe Moreira

Felipe Moreira

10/11/2015

Show hein!!!
GOSTEI 0
Ismael

Ismael

10/11/2015

Obrigado Daniel.
GOSTEI 0
POSTAR