10/4/11

Ejercicio Resuelto: Clase Fecha

El problema dice asi: 

"Crear la clase Fecha que tenga como atributos día, mes y año, en el constructor se debe validar que la fecha ingresada sea la correcta. Si la fecha ingresada es incorrecta colocar datos de tal manera que sea correcta. Además crear los métodos diaSiguiente, de tal manera que nos devuelva la fecha del día siguiente y diaAnterior que nos devuelva la fecha del día anterior."

¿Que tenemos que hacer?
  • Validar que la fecha sea la correcta
  • Crear el método diaSiguiente
  • Crear el método diaAnterior
Coloquemos algunas reglas:
  • El formato de entrada de la fecha sera "dd/mm/yyyy"
  • Solo se permiten fechas entre 1900 y 2100 ¿porque? porque no :)
  • Si la fecha que se introduce es incorrecta o no se encuentra entre el rango establecido, devolvera "25/10/2010" el dia que nacio mi perro, coloco esta fecha porque el problema no indica que tratamiento darle a una fecha erronea.
La clase se llamara jcFecha


import java.util.regex.Pattern;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class jcFecha {
    private int dia=25;
    private int mes=10;
    private int anio=2005;

    //formato fecha dd/mm/yyyy
    public jcFecha(String f){
        validarfecha(f);
    }

    //hace lo que su nombre dice que hace :?
    private void validarfecha(String f){
        boolean ok=false;
        //valida formato        
        if(Pattern.matches("\\d{1,2}/\\d{1,2}/\\d{1,4}", f)){
            //divide la fecha en dia, mes,año
            String[] ff = f.split("/");
            //valida año -> solo años entre 1900 y 2100
            anio = Integer.parseInt(ff[2]);
            if(anio>=1900 && anio<=2100){
                //valida mes -> 1 a 12
                mes = Integer.parseInt(ff[1]);
                if(mes>=1 && mes<=12){
                    //valida dia entre 1 y la cantidad de dias que tenga ese mes (incluido año bisiesto )
                    dia = Integer.parseInt(ff[0]);
                    if(dia>=1 && dia<=cantidad_dias(mes,anio)){
                        ok=true;
                    }
                }
            }
        }
        //si fecha no es valida o no cumple con las reglas anteriores
        //la fecha devolvera 25/10/2005 EL CUMPLE DE MI PERRO :)
        if(!ok){
            dia=25;
            mes=10;
            anio=2005;
        }       
    }

    public int getDia(){
        return this.dia;
    }

    public int getMes(){
        return this.mes;
    }

    public int getAnio(){
        return this.anio;
    }

    public String getFecha(){
        return  dia + "/" + mes + "/" + anio;
    }

    //metodo publico que devuelve la fecha + un dia
    public String diaSiguiente(){
        //si dias se encuentra entre el rango (1  - dia - (ultimo_dia-1)) se añade un dia
        //mes y anio se dejan como esta
        if(dia < cantidad_dias(mes,anio)){
            dia++;
        }else{//sino se debe añadir +1 al mes
            //si no es diciembre se añade +1 al mes, anio se deja como esta
            if(mes < 12){
                mes++;
                dia=1;
            }else{//si es diciembre, se pasa al año siguiente
                anio++;
                mes=1;
                dia=1;
            }
        }
        return dia + "/" + mes + "/" + anio;
    }

    /* devuelve la cantidad de dias de un mes  dado mes y año */
    private int cantidad_dias(int m, int y){
        int d =0;
        switch(m) {
            case 1: case 3: case 5: case 7: case 10: case 12: case 8:
              d=31; break;
        case 2:
            if ((y % 4 == 0) && ((y % 100 != 0) || (y % 400 == 0)))
                d=29;
            else
                d=28;
            break;
        case 4: case 6: case 9: case 11:
               d=30; break;
        }
        return d;
    }

}

Y ahora debemos probar nuestra clase jcFecha:


public class Main {       
    public static void main(String[] args) {
        //se crea el objeto jcFecha
        jcFecha jc = new jcFecha("12/12/2001");
        System.out.println("Fecha: " + jc.getFecha());
        System.out.println("next day: " + jc.diaSiguiente());
        System.out.println();

        //fecha correcta
        jc = new jcFecha("30/11/2011");
        System.out.println("Fecha: " + jc.getFecha());
        System.out.println("next day: " + jc.diaSiguiente());
        System.out.println();

        //Fecha correcta -> año bisiesto
        jc = new jcFecha("28/2/2000");
        System.out.println("Fecha: " + jc.getFecha());
        System.out.println("next day: " + jc.diaSiguiente());
        System.out.println();

        //Fecha correcta -> Año no bisiesto
        jc = new jcFecha("28/2/2002");
        System.out.println("Fecha: " + jc.getFecha());
        System.out.println("next day: " + jc.diaSiguiente());
        System.out.println();

        //fecha incorrecta
        jc = new jcFecha("01/aa/2011");
        System.out.println("Fecha: " + jc.getFecha());
        System.out.println("next day: " + jc.diaSiguiente());
        System.out.println();

        //fecha incorrecta
        jc = new jcFecha("01/10/11");
        System.out.println("Fecha: " + jc.getFecha());
        System.out.println("next day: " + jc.diaSiguiente());
        System.out.println();

        //Fecha correcta -> fecha fuera de rango
        jc = new jcFecha("10/5/1789");
        System.out.println("Fecha: " + jc.getFecha());
        System.out.println("next day: " + jc.diaSiguiente());
    }
}


Resultado en consola
Y ahora se preguntaran y donde #@Mmrrr esta el metodo DiaAnterior?????, pues no voy a hacer toda su tarea :) , solo tienen que modificar un poco el metodo diaSiguiente y listo

1 comentario:

  1. Hola excelente clase; pero tengo otro proble con la fecha y es el siguiente:
    Quiero utilizar la lebreria DateChooser pero deseo que el formato de la fecha sea año-mes-dia para guardarla en una base de datos de mysql no se como hacerlo puesto que este componente tiene el fromato de fecha dia/mes/año y solo asi d/m/aa.

    Sera posible que meayuden

    ResponderEliminar