• Sábado 21 de Septiembre de 2024, 09:36

Autor Tema:  Trabajar con Fechas en Java  (Leído 2779 veces)

infonet

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Trabajar con Fechas en Java
« en: Lunes 2 de Noviembre de 2009, 15:09 »
0
Estimados, tengo estos codigos JAVA en donde realizo operaciones con Fechas, una es la Fecha del Sistema y la Otra es la Fecha ingresada por Teclado, pero al calcular los años entre fechas, este no me da exacto...

ej: si ingreso 30/11/2008 este me dice que es 1 y mi idea es que me diga 11 mese y 28 dias...

como lo puedo hacer
Código: Java
  1.  
  2.  
  3. import  java.io.*;
  4. import java.util.*;
  5. import java.text.*;
  6. import java.util.Calendar;
  7. import java.util.GregorianCalendar;
  8.  
  9. public class Fecha
  10. {
  11.     public int dia;
  12.     public int mes;
  13.     public int año;
  14.    
  15.     public Fecha()
  16.     {}
  17.     public Fecha(int d, int m, int a)
  18.     {
  19.         this.dia = d;
  20.         this.mes = m;
  21.         this.año = a;
  22.     }
  23.     public Fecha(int d, int m )
  24.     {
  25.         this.dia = d;
  26.         this.mes = m;
  27.     }
  28.     public Fecha(int d)
  29.     {
  30.         this.dia = d;
  31.     }
  32.     public Fecha(Fecha f)
  33.     {}
  34.     void AsignarFecha(int d, int m, int a)
  35.     {
  36.         AsignarDia (d);
  37.         AsignarMes (m);
  38.         AsignarAño (a);
  39.     }
  40.    
  41.     void AsignarDia(int n)
  42.     {
  43.         dia = n;
  44.     }
  45.     void AsignarMes(int n)
  46.     {
  47.         mes = n;
  48.     }
  49.     void AsignarAño(int n)
  50.     {
  51.         año =n;
  52.     }
  53.     int obtenerDia()
  54.     {
  55.         return(dia);
  56.     }
  57.    
  58.     int obtenerMes()
  59.     {
  60.         return(mes);
  61.     }
  62.     int obtenerAño()
  63.     {
  64.         return(año);
  65.     }
  66.    
  67.     int ValidaDia(int nMes, int ndia  )
  68.     {      
  69.      int nRes=1;
  70.      
  71.      if ((ndia<=31) && (ndia>=1))
  72.      { 
  73.        switch (nMes){
  74.          case 1: if ((ndia<=31) && (ndia>=1))
  75.                  nRes = 2; break;
  76.          case 2: if ((ndia<=29) && (ndia>=1))
  77.                  nRes = 2; break;
  78.          case 3: if ((ndia<=31) && (ndia>=1))
  79.                  nRes = 2; break;
  80.          case 4: if ((ndia<=30) && (ndia>=1))
  81.                  nRes = 2; break;
  82.          case 5: if ((ndia<=31) && (ndia>=1))
  83.                  nRes = 2; break;
  84.          case 6:  if ((ndia<=30) && (ndia>=1))
  85.                  nRes = 2; break;
  86.          case 7:  if ((ndia<=31) && (ndia>=1))
  87.                  nRes = 2; break;
  88.          case 8:  if ((ndia<=31) && (ndia>=1))
  89.                  nRes = 2; break;
  90.          case 9:  if ((ndia<=30) && (ndia>=1))
  91.                  nRes = 2; break;
  92.          case 10: if ((ndia<=31) && (ndia>=1))
  93.                  nRes = 2; break;
  94.          case 11: if ((ndia<=30) && (ndia>=1))
  95.                  nRes = 2; break;
  96.          case 12: if ((ndia<=31) && (ndia>=1))
  97.                  nRes = 2; break;
  98.             }
  99.            
  100.       }    
  101.      return (nRes);
  102.     }
  103.    
  104.     int ValidaMes(int m)
  105.     {
  106.        int nRes = 1;
  107.        if ((m<=12) && (m>=1))
  108.            nRes = 2;  
  109.      return (nRes);        
  110.     }
  111.  
  112.    
  113.    
  114.     int ValidaAño(int a)
  115.     {
  116.      int nRes = 1;
  117.        if (a>=1900)
  118.            nRes = 2;  
  119.      return (nRes);            
  120.      }
  121.    
  122.    
  123.     int ValidaFecha(int d, int m, int a)
  124.     {
  125.         int nRes = 1;
  126.         int nopp=0;
  127.        
  128.         System.out.println("");
  129.             
  130.          nopp=ValidaMes(m);
  131.          if (nopp==2)
  132.          { 
  133.             nopp=ValidaDia(m,d);   
  134.             if (nopp==2)
  135.              { 
  136.                  nopp=ValidaAño(a);
  137.                  if (nopp==2)   
  138.                     {
  139.                      if (m==2)
  140.                         {           
  141.                          if ((a % 4 == 0) && ((a % 100 != 0) || (a % 400 == 0)))
  142.                             if ((d<=29) && (d>=1))
  143.                                 nRes=2;
  144.                             else   
  145.                                System.out.println("Error el Año Ingreasado es bisiesto y su diabe debe estar en el rango 1 al 29, para el mes febrero");           
  146.                          }      
  147.                         else
  148.                           nRes=2;
  149.                       }      
  150.                       else
  151.                        System.out.println("Error en el Año Ingreasado debe ser mayor o igual 1900");        
  152.                }      
  153.               else
  154.                 System.out.println("Error en el Dia Ingreasado");        
  155.             }
  156.             else
  157.               System.out.println("Error en el Mes Ingreasado");
  158.                                  
  159.      return (nRes);            
  160.     }
  161.            
  162.     public void Listar()
  163.     {
  164.         System.out.println(obtenerDia()+"/"+obtenerMes() +"/"+obtenerAño());
  165.        
  166.     }
  167.     public void print()
  168.     {
  169.         System.out.println(dia+"/"+mes+"/"+año);
  170.     }
  171.  
  172.    
  173.     long totalDias(Fecha f)
  174.         {
  175.          
  176.          GregorianCalendar gc = new GregorianCalendar(obtenerAño(), obtenerMes(),obtenerDia());
  177.          GregorianCalendar gc1 = new GregorianCalendar(f.obtenerAño(), f.obtenerMes(),f.obtenerDia());
  178.                        
  179.          Date fec1 = gc.getTime();
  180.          Date fec2 = gc1.getTime();
  181.          
  182.          long time = fec2.getTime() - fec1.getTime();
  183.                  
  184.          long tot_dia=time / (3600*24*1000);
  185.          return (tot_dia)   ;
  186.          
  187.     }
  188.    
  189.     int totalAños(Fecha f){
  190.        
  191.          int tot_año;
  192.        
  193.          GregorianCalendar date1 = new GregorianCalendar(obtenerAño(), obtenerMes(),obtenerDia());
  194.          GregorianCalendar date2 = new GregorianCalendar(f.obtenerAño(), f.obtenerMes(),f.obtenerDia());
  195.        
  196.          
  197.         if (date1.get(Calendar.YEAR) == date2.get(Calendar.YEAR))
  198.            tot_año=0;
  199.          else
  200.             tot_año = date2.get(Calendar.YEAR) - date1.get(Calendar.YEAR);
  201.             
  202.      return (tot_año); 
  203.     }
  204.    
  205.     String esBisiesto (){
  206.         String result="NO es Bisiesto ";
  207.        
  208.         if ((obtenerAño() % 4 == 0) && ((obtenerAño() % 100 != 0) || (obtenerAño() % 400 == 0)))
  209.            result="es bisiesto";
  210.                
  211.     return (result);   
  212.     }
  213.    
  214.     public void listaFechaLarga (){
  215.        
  216.        Date today;
  217.        String output;
  218.        SimpleDateFormat ftr;
  219.        DateFormatSymbols symbols;
  220.        String[] defaultDays;
  221.        DateFormat dateFormatter;
  222.        Date sDate;
  223.  
  224.  
  225.        symbols = new DateFormatSymbols(new Locale("en","U"));
  226.        defaultDays = symbols.getShortWeekdays();
  227.        
  228.       try  
  229.       {
  230.      
  231.         String fec_str=String.valueOf(obtenerDia())+"/"+ String.valueOf(obtenerMes()) +"/"+String.valueOf(obtenerAño());
  232.         SimpleDateFormat dy = new SimpleDateFormat("dd/MM/yyyy");
  233.        
  234.         today =dy.parse(fec_str);
  235.        
  236.         SimpleDateFormat sd = new SimpleDateFormat("dd MMMMM yyyy,  hh:mm aaa");
  237.        
  238.         output = sd.format(today);
  239.        
  240.         System.out.println(output);
  241.       }  
  242.       catch (ParseException e)
  243.        {
  244.            
  245.          System.out.println("Error al asignar la fecha");  
  246.         }       
  247.   }
  248. }
  249.  
  250.  
 

ESTE ES EL MAIN
Código: Java
  1.  
  2.  
  3. import  java.io.*;
  4. import  java.util.*;
  5. import java.text.*;
  6. import java.util.Calendar;
  7. import java.util.GregorianCalendar;
  8.  
  9. public class UsaFecha
  10. {
  11.  public static void main (String args[]) throws IOException, Exception
  12.     {
  13.         int dia=0, mes=0, año=0;
  14.         int d=0, m=0, a=0;
  15.         int res=0;
  16.        
  17.         String dateOut;
  18.         String string;
  19.         DateFormat dateFormatter;
  20.        
  21.        
  22.        
  23.        
  24.         BufferedReader tecla= new BufferedReader(new InputStreamReader(System.in) );
  25.         System.out.println("Operaciones para Fecha");
  26.         System.out.println(" ");
  27.         System.out.println("1. Total de Días a la fecha de hoy");
  28.         System.out.println("2. Total de Años a la fecha de hoy");
  29.         System.out.println("3. Es un año bisiesto");
  30.         System.out.println("4. Quiere Listar su fecha en formato largo");
  31.                                                                          
  32.         System.out.println("0. Salir");
  33.         System.out.println(" ");
  34.         System.out.print("selecciona una opcion: ");
  35.         int Respuesta = Integer.parseInt(tecla.readLine());
  36.         if(Respuesta==0){ res=2; System.exit(0);}
  37.         System.out.println(" ");
  38.        
  39.         Fecha Objeto1 = new Fecha();
  40.         Fecha Objeto2 = new Fecha();
  41.                
  42.         if (Respuesta==3)
  43.            {
  44.            System.out.print("Ingrese Año : ");
  45.            año=Integer.parseInt(tecla.readLine());
  46.            Objeto1.AsignarAño(año);   
  47.            res=Objeto1.ValidaAño(año);
  48.            if (res==1) System.out.println("Error en el Año debe ser mayor o igual a 1900");
  49.            }
  50.         else
  51.            {        
  52.            System.out.print("Ingrese dia : ");
  53.            dia=Integer.parseInt(tecla.readLine());
  54.        
  55.            System.out.print("Ingrese mes : ");
  56.            mes=Integer.parseInt(tecla.readLine());
  57.        
  58.            System.out.print("Ingrese Año : ");
  59.            año=Integer.parseInt(tecla.readLine());
  60.            
  61.            Objeto1.AsignarFecha(dia, mes, año);
  62.            res=Objeto1.ValidaFecha(dia, mes, año); 
  63.             
  64.            }
  65.            
  66.            
  67.        
  68.          
  69.         if (res == 2)
  70.         {
  71.           
  72.            java.util.Date hoy = new Date();
  73.         
  74.            dateFormatter = DateFormat.getDateInstance(DateFormat.DEFAULT);
  75.        
  76.            dateOut = dateFormatter.format(hoy);
  77.        
  78.            d=Integer.valueOf(dateOut.substring(0,2));
  79.            string = dateOut.substring(3);
  80.            m=Integer.valueOf(string.substring(0,2));
  81.            string = string.substring(3);
  82.            a=Integer.valueOf(string.substring(0,4));
  83.                    
  84.                 
  85.            Objeto2.AsignarDia(d);
  86.            Objeto2.AsignarMes(m);
  87.            Objeto2.AsignarAño(a);
  88.            
  89.                          
  90.            switch(Respuesta)
  91.                 {
  92.                 case 1: //Total de Días a la fecha de hoy
  93.                     System.out.println("Total de Días a la fecha de hoy "+Objeto1.totalDias(Objeto2));
  94.                 break;
  95.                 case 2://Total de Años a la fecha de hoy
  96.                     System.out.println("El Total de Años a la fecha de hoy "+  Objeto1.totalAños(Objeto2));
  97.                 break;
  98.                 case 3://Es un año bisiesto
  99.                     System.out.println("El año ingresado "+ Objeto1.esBisiesto());
  100.                 break;
  101.                 case 4://Quiere Listar su fecha en formato largo
  102.                 {
  103.                     System.out.println(" " );
  104.                     System.out.println("Su fecha en formato largo es " );
  105.                     Objeto1.listaFechaLarga();
  106.                  }      
  107.                     break;
  108.                 default:
  109.                    
  110.                     System.out.println("Selecciones una Operacion disponible");
  111.                 break; 
  112.                 }   
  113.    
  114.        }       
  115.                
  116. }   
  117.  
  118. }
  119.  
  120.  
  121.  

gophlb

  • Visitante
Re: Trabajar con Fechas en Java
« Respuesta #1 en: Lunes 2 de Noviembre de 2009, 15:21 »
0
Cita de: "infonet"
   switch (nMes){
         case 1: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 2: if ((ndia<=29) && (ndia>=1))
                 nRes = 2; break;
         case 3: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 4: if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 5: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 6:  if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 7:  if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 8:  if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 9:  if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 10: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 11: if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 12: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
            }
           
   
 [/code]
podrias mejorar este switch de la siguiente forma ->
case 1: case 3: case 7: case 8: case 10: case 12:
if ((ndia<=31) && (ndia>=1))  nRes = 2; break;

case2:
if ((ndia<=29) && (ndia>=1))  nRes = 2; break;

case 4: case 6: case 9: case 11:
if ((ndia<=30) && (ndia>=1))  nRes = 2; break;


asi, te ahorras el que si te confundes en lo que sea, solo tienes que cambiarlo una vez por grupo, no 12 veces :)


ademas, si lo que estas haciendo es validar, tu respuesta deberia ser SI o NO, no un 1 o un 2. Es decir, que esos metodos de validacion te deberian devolver un boolean en lugar de un int.

sobre por que funciona o deja de funcionar: ni idea, no tengo tiempo para ponerme a depurar codigo, pero toma nota de ese par de consejillos ;)
luego cuando llegue a casa si tengo tiempo y no te ha contestado nadie, lo vuelvo a echar un ojo

infonet

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Trabajar con Fechas en Java
« Respuesta #2 en: Lunes 2 de Noviembre de 2009, 16:17 »
0
Cita de: "gophlb"
Cita de: "infonet"
   switch (nMes){
         case 1: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 2: if ((ndia<=29) && (ndia>=1))
                 nRes = 2; break;
         case 3: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 4: if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 5: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 6:  if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 7:  if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 8:  if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 9:  if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 10: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
         case 11: if ((ndia<=30) && (ndia>=1))
                 nRes = 2; break;
         case 12: if ((ndia<=31) && (ndia>=1))
                 nRes = 2; break;
            }
           
   
 [/code]
podrias mejorar este switch de la siguiente forma ->
case 1: case 3: case 7: case 8: case 10: case 12:
if ((ndia<=31) && (ndia>=1))  nRes = 2; break;

case2:
if ((ndia<=29) && (ndia>=1))  nRes = 2; break;

case 4: case 6: case 9: case 11:
if ((ndia<=30) && (ndia>=1))  nRes = 2; break;


asi, te ahorras el que si te confundes en lo que sea, solo tienes que cambiarlo una vez por grupo, no 12 veces :)


ademas, si lo que estas haciendo es validar, tu respuesta deberia ser SI o NO, no un 1 o un 2. Es decir, que esos metodos de validacion te deberian devolver un boolean en lugar de un int.

sobre por que funciona o deja de funcionar: ni idea, no tengo tiempo para ponerme a depurar codigo, pero toma nota de ese par de consejillos ;)
luego cuando llegue a casa si tengo tiempo y no te ha contestado nadie, lo vuelvo a echar un ojo

muchas gracias, tienes razon, pero aun estoy con el problema de calculos de años

Código: Java
  1.  
  2. int totalAños(Fecha f){
  3.        
  4.          int tot_año;
  5.        
  6.          GregorianCalendar date1 = new GregorianCalendar(obtenerAño(), obtenerMes(),obtenerDia());
  7.          GregorianCalendar date2 = new GregorianCalendar(f.obtenerAño(), f.obtenerMes(),f.obtenerDia());
  8.        
  9.          
  10.         if (date1.get(Calendar.YEAR) == date2.get(Calendar.YEAR))
  11.            tot_año=0;
  12.          else
  13.             tot_año = date2.get(Calendar.YEAR) - date1.get(Calendar.YEAR);
  14.             
  15.      return (tot_año); 
  16.     }
  17.  
  18.  

ya que a este codigo el resultado no es exacto

gophlb

  • Visitante
Re: Trabajar con Fechas en Java
« Respuesta #3 en: Lunes 2 de Noviembre de 2009, 17:54 »
0
segun lo leido en otro foro (forosdelweb):
"Puedes transformar las cadenas en objetos del tipo Date a traves de SimpleDateFormat y despues de eso puedes, por ejemplo, averiguar el tiempo transcurrido entre una fecha y otra restando "getTime()" de cada una. Luego transformas la diferencia en días y listo."

mas o menos, supongo que te puede valer...si transformas tus fechas en strings del tipo YYYY/MM/DD

(o al menos eso creo)