Programación General > Java

 Trabajar con Fechas en Java

(1/1)

infonet:
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 ---  import  java.io.*;import java.util.*;import java.text.*;import java.util.Calendar;import java.util.GregorianCalendar; public class Fecha {    public int dia;    public int mes;    public int año;        public Fecha()     {}    public Fecha(int d, int m, int a)     {        this.dia = d;        this.mes = m;        this.año = a;    }    public Fecha(int d, int m )     {        this.dia = d;        this.mes = m;    }    public Fecha(int d)     {        this.dia = d;    }    public Fecha(Fecha f)     {}    void AsignarFecha(int d, int m, int a)    {        AsignarDia (d);        AsignarMes (m);        AsignarAño (a);    }        void AsignarDia(int n)    {        dia = n;    }    void AsignarMes(int n)    {        mes = n;    }    void AsignarAño(int n)    {        año =n;    }    int obtenerDia()    {        return(dia);    }        int obtenerMes()    {        return(mes);    }    int obtenerAño()    {        return(año);    }        int ValidaDia(int nMes, int ndia  )    {            int nRes=1;          if ((ndia<=31) && (ndia>=1))     {         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;            }                  }          return (nRes);    }        int ValidaMes(int m)    {       int nRes = 1;       if ((m<=12) && (m>=1))           nRes = 2;        return (nRes);             }             int ValidaAño(int a)    {     int nRes = 1;       if (a>=1900)           nRes = 2;        return (nRes);                  }            int ValidaFecha(int d, int m, int a)    {        int nRes = 1;        int nopp=0;                System.out.println("");                     nopp=ValidaMes(m);         if (nopp==2)         {              nopp=ValidaDia(m,d);                if (nopp==2)             {                   nopp=ValidaAño(a);                 if (nopp==2)                       {                     if (m==2)                         {                                    if ((a % 4 == 0) && ((a % 100 != 0) || (a % 400 == 0)))                            if ((d<=29) && (d>=1))                                nRes=2;                            else                                   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");                                    }                              else                          nRes=2;                      }                             else                       System.out.println("Error en el Año Ingreasado debe ser mayor o igual 1900");                       }                     else                System.out.println("Error en el Dia Ingreasado");                    }            else              System.out.println("Error en el Mes Ingreasado");                                       return (nRes);                 }                public void Listar()    {        System.out.println(obtenerDia()+"/"+obtenerMes() +"/"+obtenerAño());            }     public void print()    {        System.out.println(dia+"/"+mes+"/"+año);    }         long totalDias(Fecha f)         {                  GregorianCalendar gc = new GregorianCalendar(obtenerAño(), obtenerMes(),obtenerDia());         GregorianCalendar gc1 = new GregorianCalendar(f.obtenerAño(), f.obtenerMes(),f.obtenerDia());                                 Date fec1 = gc.getTime();         Date fec2 = gc1.getTime();                  long time = fec2.getTime() - fec1.getTime();                           long tot_dia=time / (3600*24*1000);         return (tot_dia)   ;             }        int totalAños(Fecha f){                 int tot_año;                 GregorianCalendar date1 = new GregorianCalendar(obtenerAño(), obtenerMes(),obtenerDia());         GregorianCalendar date2 = new GregorianCalendar(f.obtenerAño(), f.obtenerMes(),f.obtenerDia());                        if (date1.get(Calendar.YEAR) == date2.get(Calendar.YEAR))            tot_año=0;         else             tot_año = date2.get(Calendar.YEAR) - date1.get(Calendar.YEAR);                 return (tot_año);     }        String esBisiesto (){        String result="NO es Bisiesto ";                if ((obtenerAño() % 4 == 0) && ((obtenerAño() % 100 != 0) || (obtenerAño() % 400 == 0)))           result="es bisiesto";                    return (result);        }        public void listaFechaLarga (){               Date today;       String output;       SimpleDateFormat ftr;       DateFormatSymbols symbols;       String[] defaultDays;       DateFormat dateFormatter;       Date sDate;         symbols = new DateFormatSymbols(new Locale("en","U"));       defaultDays = symbols.getShortWeekdays();             try        {              String fec_str=String.valueOf(obtenerDia())+"/"+ String.valueOf(obtenerMes()) +"/"+String.valueOf(obtenerAño());        SimpleDateFormat dy = new SimpleDateFormat("dd/MM/yyyy");                today =dy.parse(fec_str);                 SimpleDateFormat sd = new SimpleDateFormat("dd MMMMM yyyy,  hh:mm aaa");                output = sd.format(today);                System.out.println(output);      }        catch (ParseException e)       {                     System.out.println("Error al asignar la fecha");           }         }}     

ESTE ES EL MAIN

--- Código: Java ---  import  java.io.*;import  java.util.*;import java.text.*;import java.util.Calendar;import java.util.GregorianCalendar; public class UsaFecha { public static void main (String args[]) throws IOException, Exception     {        int dia=0, mes=0, año=0;         int d=0, m=0, a=0;         int res=0;                String dateOut;        String string;        DateFormat dateFormatter;                                        BufferedReader tecla= new BufferedReader(new InputStreamReader(System.in) );        System.out.println("Operaciones para Fecha");        System.out.println(" ");        System.out.println("1. Total de Días a la fecha de hoy");         System.out.println("2. Total de Años a la fecha de hoy");        System.out.println("3. Es un año bisiesto");         System.out.println("4. Quiere Listar su fecha en formato largo");                                                                                   System.out.println("0. Salir");        System.out.println(" ");        System.out.print("selecciona una opcion: ");        int Respuesta = Integer.parseInt(tecla.readLine());         if(Respuesta==0){ res=2; System.exit(0);}        System.out.println(" ");                Fecha Objeto1 = new Fecha();        Fecha Objeto2 = new Fecha();                        if (Respuesta==3)           {           System.out.print("Ingrese Año : ");           año=Integer.parseInt(tecla.readLine());           Objeto1.AsignarAño(año);              res=Objeto1.ValidaAño(año);           if (res==1) System.out.println("Error en el Año debe ser mayor o igual a 1900");           }        else           {                    System.out.print("Ingrese dia : ");           dia=Integer.parseInt(tecla.readLine());                   System.out.print("Ingrese mes : ");           mes=Integer.parseInt(tecla.readLine());                   System.out.print("Ingrese Año : ");           año=Integer.parseInt(tecla.readLine());                      Objeto1.AsignarFecha(dia, mes, año);           res=Objeto1.ValidaFecha(dia, mes, año);                        }                                               if (res == 2)        {                     java.util.Date hoy = new Date();                    dateFormatter = DateFormat.getDateInstance(DateFormat.DEFAULT);                   dateOut = dateFormatter.format(hoy);                   d=Integer.valueOf(dateOut.substring(0,2));           string = dateOut.substring(3);           m=Integer.valueOf(string.substring(0,2));           string = string.substring(3);           a=Integer.valueOf(string.substring(0,4));                                               Objeto2.AsignarDia(d);           Objeto2.AsignarMes(m);           Objeto2.AsignarAño(a);                                                switch(Respuesta)                {                case 1: //Total de Días a la fecha de hoy                    System.out.println("Total de Días a la fecha de hoy "+Objeto1.totalDias(Objeto2));                break;                case 2://Total de Años a la fecha de hoy                    System.out.println("El Total de Años a la fecha de hoy "+  Objeto1.totalAños(Objeto2));                break;                case 3://Es un año bisiesto                    System.out.println("El año ingresado "+ Objeto1.esBisiesto());                break;                case 4://Quiere Listar su fecha en formato largo                {                    System.out.println(" " );                    System.out.println("Su fecha en formato largo es " );                    Objeto1.listaFechaLarga();                 }                          break;                default:                                        System.out.println("Selecciones una Operacion disponible");                break;                  }              }                        }    }   

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]
--- Fin de la cita ---
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:

--- 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]
--- Fin de la cita ---
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
--- Fin de la cita ---

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


--- Código: Java --- int totalAños(Fecha f){                 int tot_año;                 GregorianCalendar date1 = new GregorianCalendar(obtenerAño(), obtenerMes(),obtenerDia());         GregorianCalendar date2 = new GregorianCalendar(f.obtenerAño(), f.obtenerMes(),f.obtenerDia());                        if (date1.get(Calendar.YEAR) == date2.get(Calendar.YEAR))            tot_año=0;         else             tot_año = date2.get(Calendar.YEAR) - date1.get(Calendar.YEAR);                 return (tot_año);     }  
ya que a este codigo el resultado no es exacto

gophlb:
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)

Navegación

[0] Índice de Mensajes

Ir a la versión completa