Calcular numero de días entre dos fechas!

Iniciado por *-.Sub-Vorbio.-*, 13 Noviembre 2008, 05:48 AM

0 Miembros y 1 Visitante están viendo este tema.

*-.Sub-Vorbio.-*

Básicamente este es el ejercicio que me dan para desarrollar solución. El problema me aparece cuando intento admitir a los bisiestos en mi método, no sé como hacerlo. Alguna idea?

Estoy terminando de desarrollar mi "código", entrecomillas, lo "posteare", entrecomillas, en breve.

Salu2!!
Sub-vorb.
"Al clavo salido le toca siempre el martillazo."

"Cuando los elefantes luchan, la hierba es la que sufre."

joseprox

Hey mi vale....nosé pero te paso este codigo que lo hice inmediatamente lo vi en el foro ojalá te sirva de ayuda........funciona ok....tu debes realizar las respectivas capturas de errores.....como digitar la fecha con el formato debido....el programa está diseñado para que se digite primero la fecha Mayor y luego la fecha Menor...

en el siguiente formato yyyy/mm/aa osea año/mes/dia -> 2008/11/16 ......

package fechas;
import java.util.*;
public class fechas {
   public static void main(String a[]){
      
      String FM = "2008/10/31";
      String fm = "2008/09/30";
      
      
      
      
      StringTokenizer stM = new StringTokenizer(FM,"/");
      //int re = FM - fm;
      int anoM = Integer.parseInt(stM.nextToken());    
      int mesM = Integer.parseInt(stM.nextToken());    
      int diaM = Integer.parseInt(stM.nextToken());    
      
      
      StringTokenizer st = new StringTokenizer(fm,"/");
      //int re = FM - fm;
      int anom = Integer.parseInt(st.nextToken());    
      int mesm = Integer.parseInt(st.nextToken());    
      int diam = Integer.parseInt(st.nextToken());    
      
      
      int FMAYOR = Integer.parseInt(anoM+""+mesM+""+diaM);
      int FMENOR = Integer.parseInt(anom+""+mesm+""+diam);
      
      
      if(FMAYOR >= FMENOR){
      
         int mesMaux = mesM;
         int diaMaux = diaM;
          
         int cont = 0;
      
         while(anom<=anoM){
         
          if(anom<anoM){
            mesM = 12;
             diaM = 31;
          }else{
             mesM = mesMaux;
             diaM = diaMaux;
          }
         
         while(mesm <= mesM){
         
          int DiasDelMes = 0;
          
           if(mesm == mesM){
              DiasDelMes = diaM;
           }else{
             DiasDelMes = DiasDelMes(anom,mesm);
           } 
            
            while(diam <= DiasDelMes){
             cont++;
             diam++;
            }
             diam = 1;
             mesm ++;
           }   
          
           mesm = 1;
           anom++;
         }
          
              
            
      System.out.println ("Numero de dias contados -> "+(cont-1));
      System.out.println ("Con el dia de inicio incluido serian -> "+cont);
         
      }else{
         System.out.println ("Error....!!La fecha Menor supera a la fecha Mayor");
      }
      
      
   }
   
   public static int DiasDelMes(int ano, int mes){
     int ndias = 0;
     int f = 0;

      int an = ano;

      if(an % 4 == 0){
          f = 29;
         }else{
          f = 28;
         }
     switch (mes) {
        case 1:   ndias = 31;  break;
        case 2:   ndias = f;   break;
        case 3:   ndias = 31;  break;
        case 4:   ndias = 30;  break;
        case 5:   ndias = 31;  break;
        case 6:   ndias = 30;  break;
        case 7:   ndias = 31;  break;
        case 8:   ndias = 31;  break;
        case 9:   ndias = 30;  break;
        case 10:  ndias = 31;  break;
        case 11:  ndias = 30;  break;
        case 12:  ndias = 31;  break;
        }
     return ndias;
  }
}


Hey mi vale si te funciona como lo quieres.......escribeme al mail joseprox@gmail.com......indentificate como Sub-Vorbio+elhacker.net...
para saber que eres tu...

joseprox Ingeniero de Sistemas....
Toda persona tiene derecho a cometer errores...
la verdad es q solo ella es RESPONSABLE DE LO QUE HACE.....!!!!!

IsHeR

Oye Sub-Vorbio conseguiste resolver el problema de los dias entre las dos fechas??

Yo stoi rompiendome la cabeza aver si consigo algo, el problema es q en todos los ejemplos que e visto al respecto de manejo de fechas en java, es utilizando las clases Date y Calendar q vienen con java, sin embargo nosotros debemos "hacerlo a pelo" xk no nos dejan utilizar nada de eso, solo codigo de creacion propia y lo mas sencillo posible.

De toas formas el planteamiento sería el siguiente: recibes por linea de comandos 2 fechas cualeskiera, lo q serian dos arrays de 3 posiciones cada uno, luego tendrias q pasar la fecha menor a dias, (contando desde el año 0),luego pasar la fecha mayor a dias tb, y restar a la fecha mayor la fecha menor en numero de dias, todo esto teniendo en cuenta los años bisiestos
--El peor enemigo del arte es el buen gusto--

sapito169

si quieren resolverlo des de 0 esta vien
pero otra opcion es hacer trampa usando el codigo que alguien a echo es decir usando clases

*-.Sub-Vorbio.-*

#4
Acabo de hacer esto para calcular los dias del primer año y del ultimo, restante o vencidos, falta por hacer que se vayan guardando el numero de años bisiestos que hay entremedio, que tengo el algoritmo pero no se como guardar ese dato en algun sitio.

Es esto:  public static void main (String [] args){

int []year1 = {1,1,1998};//menor es primerafecha
int []year2 = {31,12,2000};//mayor es segundafecha
int d1; int f1, f2; int diasaño1, diasaño2;
if ((year1[2]%4==0) && ((year1[2]%100!=0) || (year1[2]%400==0))) d1=1; else d1=0;
if ((year1[2]%4==0) && ((year1[2]%100!=0) || (year1[2]%400==0))) f1=29; else f1=28;
if ((year2[2]%4==0) && ((year2[2]%100!=0) || (year2[2]%400==0))) f2=29; else f2=28;

//Dias que quedan a DIA inicial de cada mes para finalizar el año de la fecha1 sin incluir year1[0].
if (year1[1] == 1) diasaño1=365+d1; else
{if (year1[1] == 2) diasaño1=306+f1;else
{if (year1[1] == 3) diasaño1=306;else
{if (year1[1] == 4) diasaño1=275;else
{if (year1[1] == 5) diasaño1=245;else
{if (year1[1] == 6) diasaño1=214;else
{if (year1[1] == 7) diasaño1=184;else
{if (year1[1] == 8) diasaño1=153;else
{if (year1[1] == 9) diasaño1=122;else
{if (year1[1] == 10) diasaño1=92;else
{if (year1[1] == 11) diasaño1=61;else
{if (year1[1] == 12) diasaño1=31;else diasaño1 = 0;}}}}}}}}}}}
//Algoritmo dias restantes para fin de año.
int diasaño11=diasaño1-year1[0];
System.out.println(diasaño11);
//Dias que han pasado a DIA inicial de cada mes del año de la fecha2.
if (year2[1] == 1) diasaño2=0; else
{if (year2[1] == 2) diasaño2=31;else
{if (year2[1] == 3) diasaño2=31+f2;else
{if (year2[1] == 4) diasaño2=62+f2;else
{if (year2[1] == 5) diasaño2=92+f2;else
{if (year2[1] == 6) diasaño2=123+f2;else
{if (year2[1] == 7) diasaño2=153+f2;else
{if (year2[1] == 8) diasaño2=184+f2;else
{if (year2[1] == 9) diasaño2=215+f2;else
{if (year2[1] == 10) diasaño2=245+f2;else
{if (year2[1] == 11) diasaño2=275+f2;else
{if (year2[1] == 12) diasaño2=306+f2;else diasaño2 = 0;}}}}}}}}}}}
//Algoritmo dias vencidos desde principio de año incluido year2[0].
int diasaño22=year2[0]+(diasaño2);
System.out.println(diasaño22);
//Resultado de sumar todos los días:
int numeroañosenmedio; numeroañosenmedio=year2[2]-year1[2]-1;
int numerobisiestos=¿?;//AQUI RADICA EL PROBLEMA!!!
int resulta=diasaño11+diasaño22+((365*numeroañosenmedio)+numerobisiestos);
System.out.println(resulta);
}
// public static double numbisiesto(int year1,int year2){
// for (int i=year1;i<year2;i++){
// if ((i%4==0) && ((i%100!=0) || (i%400==0)))
// System.out.println(i + "*El año inicial es bisiesto");
// }
// return 0;



NECESITO: (En el código pone AQUI RADICA EL PROBLEMA!!!)
Algo que permita mantener la unidad cada vez que el for en su pasada de verdadero, para que al terminar el for tenga fuera del método una variable que contenga la cantidad de veces que el for respondió verdadero, algo que cuente el numero de bisiestos que hay.

A ver que se ocurre.. Un salu2. Gracias de antemano.
Sub-vorbio.

PD: IsHeR espero que esto te sirva de algo también a tí! gracias por reintroducirme en este ejercicio!
"Al clavo salido le toca siempre el martillazo."

"Cuando los elefantes luchan, la hierba es la que sufre."

joseprox

Hey mi vale deja de tirar codigo innecesario.....el programa que te pasé hace toda esa vaina.....

si quiere cambian el codigo que pasé por este.......

te digo el Integer.parseInt("ValorString")... te convierte un numero que este entre las comillas a un valor entero..

ejemplo
    int valor = Integer.parseInt( "250" )... pilla que 250 está entre comillas
    la variable valor guardará el 250 como un valor entero.........
   
    BufferedReader es una clase que permite recibir valor por la consola del cmd...
    por medio de la funcion o metodo br.readLine();
   


package fechas;
import java.io.*;
public class fechas {
public static void main(String a[]){
   
try {
   
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));

String FechaMayor[] = new String[3];
System.out.println("DIGITE ANO/MES/DIA De la Fecha Mayor");
System.out.print("DIGITE ANO:  ");
FechaMayor[0] = br.readLine();
System.out.println ();
System.out.print("DIGITE MES:  ");
FechaMayor[1] = br.readLine();
System.out.println ();
System.out.print("DIGITE DIA:  ");
FechaMayor[2] = br.readLine();
System.out.println ();
      
      
String FechaMENOR[] = new String[3];
System.out.println("DIGITE ANO/MES/DIA De la Fecha MENOR");
System.out.print("DIGITE ANO:  ");
FechaMENOR[0] = br.readLine();
System.out.println ();
System.out.print("DIGITE MES:  ");
FechaMENOR[1] = br.readLine();
System.out.println ();
System.out.print("DIGITE DIA:  ");
FechaMENOR[2] = br.readLine();
System.out.println ();
      
      
//int re = FM - fm;
int anoM = Integer.parseInt(FechaMayor[0]);    
int mesM = Integer.parseInt(FechaMayor[1]);    
int diaM = Integer.parseInt(FechaMayor[2]);    

//int re = FM - fm;
int anom = Integer.parseInt(FechaMENOR[0]);    
int mesm = Integer.parseInt(FechaMENOR[1]);    
int diam = Integer.parseInt(FechaMENOR[2]);    
      
      
int FMAYOR = Integer.parseInt(anoM+""+mesM+""+diaM);
int FMENOR = Integer.parseInt(anom+""+mesm+""+diam);
      
      
if(FMAYOR >= FMENOR){
      int mesMaux = mesM;
      int diaMaux = diaM;
          
   int cont = 0;
   while(anom<=anoM){
         
    if(anom<anoM){
      mesM = 12;
      diaM = 31;
    }else{
      mesM = mesMaux;
      diaM = diaMaux;
    }
         
   while(mesm <= mesM){
    int DiasDelMes = 0;
       if(mesm == mesM){
             DiasDelMes = diaM;
       }else{
             DiasDelMes = DiasDelMes(anom,mesm);
       } 
            
       while(diam <= DiasDelMes){
            cont++;
            diam++;
       }
   diam = 1;
   mesm ++;
              }   
    mesm = 1;
    anom++;
      }
          
        System.out.println ("Numero de dias contados -> "+(cont-1));
        System.out.println ("Con el dia de inicio incluido serian -> "+cont);
  }else{
        System.out.println ("Error....!!La fecha Menor supera a la fecha Mayor");
  }
   
    }catch (Exception ex) {
       System.out.println ("Ocurrio un error...en -> "+ex.getMessage());
    }   
}//fin del main
   
/*Esta funcion te valida los años que son y que no son Biciestos*/
   
public static int DiasDelMes(int ano, int mes){
     int ndias = 0;
     int f = 0;

      int an = ano;

      if(an % 4 == 0){
          f = 29;
         }else{
          f = 28;
         }
     switch (mes) {
        case 1:   ndias = 31;  break;
        case 2:   ndias = f;   break;
        case 3:   ndias = 31;  break;
        case 4:   ndias = 30;  break;
        case 5:   ndias = 31;  break;
        case 6:   ndias = 30;  break;
        case 7:   ndias = 31;  break;
        case 8:   ndias = 31;  break;
        case 9:   ndias = 30;  break;
        case 10:  ndias = 31;  break;
        case 11:  ndias = 30;  break;
        case 12:  ndias = 31;  break;
        }
     return ndias;
  }//fin del metodo DiasDelMes
} //fin de la clase Fechas....


hey mi vale disculpa pero tienes las vainas a la mano y no las quieres aprovechar...no seas terco..........

Toda persona tiene derecho a cometer errores...
la verdad es q solo ella es RESPONSABLE DE LO QUE HACE.....!!!!!

*-.Sub-Vorbio.-*

De acuerdo, seguiré tu consejo, aunque siempre me hubiera gustado saber hacer lo que me faltó en mi "peculiar código". Estuve probando tu código, funciona bastante bien, no sé como conseguiste hacer que aparezca en qué lugar ocurrió el error en su caso, bastante bueno. Seguiré mirándolo a ver si me ilustra un poco!

Salu2!
Sub-Vorbio.
"Al clavo salido le toca siempre el martillazo."

"Cuando los elefantes luchan, la hierba es la que sufre."

joseprox

Vuelvo y te digo.....pregunta lo que quieras......si quieres te explico el codigo....
tu tienes cuenta  en gmail.com......de ser así conectemonos y chateamos un rato explicando el codigo.......mi vale....no creas que te estoy humillando o menoscabando.......reconozco que eres nuevo en este mundo.......yo tambien pasé por donde tu estas actualmente.....pero preguntaba mas que un periodista...a las personas que estaban en un nivel mas alto que yo......

Yo siempre dije: "Si ellos saben, yo tambien tengo que saber...y quizas mas que eellos..............".....no olvides esto....OK.....


Pregunta......y colocate deacuerdo pá explicante el codigo por gmail......messenger no..... ahí...hay un puto virus que me hizo Formatear el PC.....él se pasa automaticamente como una imagen de un contacto tuyo......

De hoy lunes hasta el viernes puedes conectarte.......por gmail.....

de 10:00 pm hora colombiana......no sé de donde eres tu.....Todo bien mi vale....
SALUDOS::::::::::
Toda persona tiene derecho a cometer errores...
la verdad es q solo ella es RESPONSABLE DE LO QUE HACE.....!!!!!

joseprox

confirmame....para estar pendiente.....................
Toda persona tiene derecho a cometer errores...
la verdad es q solo ella es RESPONSABLE DE LO QUE HACE.....!!!!!

Choclito

#9

bueno ahi te Dejo Algunos Ejercicios pero estan echos en C# Similar al Java ojala que te Sriva.


using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication10
{
    class Program
    {
        static void Main(string[] args)
        {
            int mm, aa, mm2, aa2, nordemese=0, nordemese2=0;
            int totaldias;
            //leer mes y año de las dos fechas
            Console.Write("Ingresa Mes de la Fecha 1:");
            mm = int.Parse(Console.ReadLine());
            Console.Write("Ingresa Año de la Fecha 1:");
            aa = int.Parse(Console.ReadLine());
            Console.Write("Ingresa Mes de la Fecha 2:");
            mm2 = int.Parse(Console.ReadLine());
            Console.Write("Ingresa Año de la Fecha 2:");
            aa2 = int.Parse(Console.ReadLine());
            //determinar el numero de dias de la primera fecha
            if ((mm == 1) || (mm == 3) || (mm == 5) || (mm == 7) || (mm == 8 )|| (mm == 10) || (mm == 12))
            {
                nordemese = 31;

            }
            else if ((mm == 4 )||( mm == 6 )|| (mm == 9) || (mm == 11))
            {
                nordemese = 30;
            }

            else if (mm == 2)
            {
                if ((aa % 4) == 0)
                    nordemese = 29;
                else
                    nordemese = 28;
            }


            //calculamos los días dela segunda fecha
            if ((mm2 == 1) || (mm2 == 3) ||( mm2 == 5) ||( mm2 == 7) ||( mm2 == 8) ||( mm2 == 10) || (mm2 == 12))
                nordemese2 = 31;
            else if ((mm2 == 4) || (mm2 == 6) || (mm2 == 9) || (mm2 == 11))
                nordemese2 = 30;
            else if (mm2 == 2)
            {

                if (aa2 % 4 == 0)
                    nordemese2 = 29;
                else
                    nordemese2 = 28;
            }
           
            totaldias = nordemese + nordemese2;
            Console.WriteLine("El Total de Dias entre las dos fechas es : {0}", totaldias);


            Console.Read();
        }
    }
}


      
            int N;
            int Miles, Resto, Cen, Dec, Uni;
    do
    {
      Console.WriteLine("Ingresa Número(1-3999):");
      N=int.Parse(Console.ReadLine());
    }while(N<1|| N>3999);
            Miles = N / 1000;
            Resto = N % 1000;
            Cen = Resto / 100;
            Resto = Resto % 100;
            Dec = Resto / 10;
            Resto = Resto % 10;
            Uni = Resto;
            Console.Write("En Número Romanos es : ");
            switch (Miles)
            {
                case 1: Console.Write("M"); break;
                case 2: Console.Write("MM"); break;
                case 3: Console.Write("MMM"); break;
            }
            switch (Cen)
            {
                case 1: Console.Write("C"); break;
                case 2: Console.Write("CC"); break;
                case 3: Console.Write("CCC"); break;
                case 4: Console.Write("CD"); break;
                case 5: Console.Write("D"); break;
                case 6: Console.Write("DC"); break;
                case 7: Console.Write("DCC"); break;
                case 8: Console.Write("DCCC"); break;
                case 9: Console.Write("CM"); break;
            }
            switch (Dec)
            {
                case 1: Console.Write("X");
                    break;
                case 2: Console.Write("XX");
                    break;
                case 3: Console.Write("XXX");
                    break;
                case 4: Console.Write("XL");
                    break;
                case 5: Console.Write("L");
                    break;
                case 6: Console.Write("LX");
                    break;
                case 7: Console.Write("LXX");
                    break;
                case 8: Console.Write("LXXX");
                    break;
                case 9: Console.Write("XC");
                    break;
            }
            switch (Uni)
            {
                case 1: Console.Write("I"); break;
                case 2: Console.Write("II"); break;
                case 3: Console.Write("III"); break;
                case 4: Console.Write("IV"); break;
                case 5: Console.Write("V"); break;
                case 6: Console.Write("VI"); break;
                case 7: Console.Write("VII"); break;
                case 8: Console.Write("VIII"); break;
                case 9: Console.Write("IX"); break;
            }