Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con getMaximum (GregorianCalendar)

Estas en el tema de Problema con getMaximum (GregorianCalendar) en el foro de Java en Foros del Web. ¡Buenas! Estoy haciendo un ejercicio de JAVA que consiste en determinar los días de la semana en los que cayó una fecha en los últimos ...
  #1 (permalink)  
Antiguo 24/10/2013, 05:28
 
Fecha de Ingreso: mayo-2009
Mensajes: 22
Antigüedad: 15 años
Puntos: 1
Problema con getMaximum (GregorianCalendar)

¡Buenas! Estoy haciendo un ejercicio de JAVA que consiste en determinar los días de la semana en los que cayó una fecha en los últimos 10 años, introduciendo un día y un mes como parámetros.

Este es el código que llevo hecho hasta ahora:

Código Java:
Ver original
  1. import java.util.GregorianCalendar;
  2.  
  3. public class Calendario {
  4.  
  5.     public static void main(String[] args) {
  6.  
  7.         GregorianCalendar calendario = new GregorianCalendar();
  8.  
  9.         int día = Integer.parseInt(args[0]);
  10.         int mes = Integer.parseInt(args[1]);
  11.         int añoactual = GregorianCalendar.getInstance().get(GregorianCalendar.YEAR);
  12.  
  13.         calendario.set(GregorianCalendar.YEAR, añoactual);
  14.         calendario.set(GregorianCalendar.MONTH, mes - 1);
  15.  
  16.         if (día > calendario.getMaximum(GregorianCalendar.DAY_OF_MONTH)
  17.                 || día < 1 && mes < 1 || mes > 12) {
  18.             System.out.println("Esta fecha no es válida, introduzca otros valores.");
  19.             System.exit(1);
  20.         }
  21.  
  22.         calendario.set(GregorianCalendar.DAY_OF_MONTH, día - 1);
  23.         if(mes==2 && día==29 && !calendario.isLeapYear(calendario.get(GregorianCalendar.YEAR))){
  24.         System.out.println("Este año no es bisiesto, por lo tanto no hay 29 de Febrero \n");
  25.         }else{
  26.         System.out.println("El "+día+ " de " + MesconLetras(mes-1) + " de " + añoactual + " es " + DíaconLetras(calendario.get(GregorianCalendar.DAY_OF_WEEK)) + "\n");
  27.         }
  28.        
  29.        
  30.         for (int i = 0; i < 11; i++) {
  31.            
  32.             calendario.add(GregorianCalendar.YEAR, -1);
  33.            
  34.             boolean bisiesto = calendario.isLeapYear(calendario
  35.                     .get(GregorianCalendar.YEAR));
  36.            
  37.             if (mes == 2 && día == 29 && bisiesto == false) {
  38.                 System.out.println("En el año "
  39.                         + calendario.get(GregorianCalendar.YEAR)
  40.                         + " esta fecha no existió (Año no bisiesto) \n");
  41.             } else {
  42.                 System.out.println("En el año "
  43.                         + calendario.get(GregorianCalendar.YEAR)
  44.                         + ", el día "
  45.                         + día
  46.                         + " de "
  47.                         + MesconLetras(mes - 1)
  48.                         + " fue "
  49.                         + DíaconLetras(calendario
  50.                                 .get(GregorianCalendar.DAY_OF_WEEK)) + "\n");
  51.             }
  52.  
  53.         }
  54.     }
  55.  
  56.     public static String MesconLetras(int numero) {
  57.         switch (numero) {
  58.         case 0:
  59.             return "Enero";
  60.         case 1:
  61.             return "Febrero";
  62.         case 2:
  63.             return "Marzo";
  64.         case 3:
  65.             return "Abril";
  66.         case 4:
  67.             return "Mayo";
  68.         case 5:
  69.             return "Junio";
  70.         case 6:
  71.             return "Julio";
  72.         case 7:
  73.             return "Agosto";
  74.         case 8:
  75.             return "Septiempre";
  76.         case 9:
  77.             return "Octubre";
  78.         case 10:
  79.             return "Noviembre";
  80.         case 11:
  81.             return "Diciembre";
  82.         default:
  83.             return null;
  84.         }
  85.     }
  86.  
  87.     public static String DíaconLetras(int numero) {
  88.         switch (numero) {
  89.         case 1:
  90.             return "Lunes";
  91.         case 2:
  92.             return "Martes";
  93.         case 3:
  94.             return "Miércoles";
  95.         case 4:
  96.             return "Jueves";
  97.         case 5:
  98.             return "Viernes";
  99.         case 6:
  100.             return "Sábado";
  101.         case 7:
  102.             return "Domingo";
  103.         default:
  104.             return null;
  105.         }
  106.     }
  107. }

Creo que no voy mal encaminado, sin embargo, tal como está el código, si introduzco como parámetros el 31 del mes 11 (Noviembre), fecha que no existe (pues Noviembre tiene 30 días), el programa me devuelve esto:

Cita:
El 31 de Noviembre de 2013 es Domingo

En el año 2012, el día 31 de Noviembre fue Sábado

En el año 2011, el día 31 de Noviembre fue Jueves

En el año 2010, el día 31 de Noviembre fue Miércoles

En el año 2009, el día 31 de Noviembre fue Martes

En el año 2008, el día 31 de Noviembre fue Lunes

En el año 2007, el día 31 de Noviembre fue Sábado

En el año 2006, el día 31 de Noviembre fue Viernes

En el año 2005, el día 31 de Noviembre fue Jueves

En el año 2004, el día 31 de Noviembre fue Miércoles

En el año 2003, el día 31 de Noviembre fue Lunes

En el año 2002, el día 31 de Noviembre fue Domingo
En todos los demás aspectos el programa funciona perfectamente, incluso funciona bien con los bisiestos y el 29 de Febrero. Pero eso falla, sin duda no estoy usando bien el getMaximum...

¿Alguien sabe cuál es mi problema?

Muchas gracias.
  #2 (permalink)  
Antiguo 24/10/2013, 19:57
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Problema con getMaximum (GregorianCalendar)

Hola,

Básicamente el problema es la precedencia de los operadores,

if (día > calendario.getMaximum(GregorianCalendar.DAY_OF_MON TH)
|| día < 1 && mes < 1 || mes > 12) {

La precedencia de los operadores en java es primero el and y despues el or. Suponiendo que la fecha es 31/Nov, primero se evalúa:

dia < 1 && mes < 1 y devuelve falso.

Seguidamente se evalúa:

dia > cale.. || (expresion anterior) y devuelve true.

Por último se evalúa:

(expresion anterior) || mes > 12 y devuelve false.

Me imagino que querías hacer lo siguiente, (aunque no estoy seguro), posiblemente tengas que agregar o cambiar los paréntesis donde corresponde:

Código Java:
Ver original
  1. if ((día > calendario.getMaximum(GregorianCalendar.DAY_OF_MONTH)
  2.                 || día < 1) && (mes < 1 || mes > 12)) {
Al agregar los paréntesis se cambia la jerarquía de los operadores.

Otra cosa es que no necesitas traducir los días y los meses, Java esta hecho para que funcione en cualquier lenguaje solamente tienes que configurar correctamente el sistema operativo o usar java.util.Locale y java.text.DateFormatSymbols, o algún Formatter.


Saludos,

Etiquetas: programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:27.