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
Ir a la versión completa