jueves, 22 de enero de 2015

Clase fecha (80) v2.0

package ejercicio80;

/**
 *
 * @author juan
 */
public class Fecha {

    private int dia;
    private int mes;
    private int anyo;

    /**
     * Constructor por defecto genera fechas al 1 del 1 del 2013
     */
    public Fecha() {
        this.dia = 1;
        this.mes = 1;
        this.anyo = 2013;
    }

    /**
     * Constructor al que les pasamos tres parámetros si la fecha es posible se
     * le asigna en caso de fecha incorrecta inicializa el objeto al 1-1-2013
     *
     * @param dia representa el día de la fecha completa
     * @param mes mes de la fecha
     * @param anyo año de la fecha
     */
    public Fecha(int dia, int mes, int anyo) {
        if (comprobarFecha(dia, mes, anyo)) {
            this.dia = dia;
            this.mes = mes;
            this.anyo = anyo;
        } else {
            this.dia = 1;
            this.mes = 1;
            this.anyo = 2013;
        }
    }

    /**
     * Permite asignar día, mes y anyo al objeto fecha. Si la asignación es
     * correcta devuelve true, en caso contrario false.
     *
     * @param dia día del año que se quiere asignar
     * @param mes mes del año en formato numérico
     * @param anyo año en formato numérico
     * @return true si la fecha asignada es posible, false en caso contrario
     */
    public boolean asignate(int dia, int mes, int anyo) {
        boolean retorno = false;

        if (comprobarFecha(dia, mes, anyo)) {
            this.dia = dia;
            this.mes = mes;
            this.anyo = anyo;
 
          retorno = true;
        }
        return retorno;
    }

    public int getAnyo() {
        return anyo;
    }

    public void setAnyo(int anyo) {
        if (comprobarFecha(dia, mes, anyo)) {
            this.anyo = anyo;
        }
    }

    public int getDia() {
        return dia;
    }

    public void setDia(int dia) {
        if (comprobarFecha(dia, mes, anyo)) {
            this.dia = dia;
        }
    }

    public int getMes() {
        return mes;
    }

    /**
     * si el mes es correcto (teniendo en cuenta ya el día y el año que tiene
     * asignada la fecha) se cambiará el mes por el que pasamos como parámetro
     *
     * @param mes representa el NUEVO mes que queremos asignar a la fecha
     */
    public void setMes(int mes) {
        if (comprobarFecha(dia, mes, anyo)) {
            this.mes = mes;
        }
    }

    /**
     * Método para comprobar si un año es bisiesto.
     *
     * @param num año que queremos comprobar si es bisiesto o no
     * @return Devuelve true si el año es bisiesto y false en caso contrario
     */
    private boolean esBisiesto(int num) {
        return ((num % 4 == 0 && num % 100 != 0) || (num % 500 == 0));
    }

    /**
     * Comprueba si la fecha dada es correcta, teniendo en cuenta, los días de
     * cada mes y los años bisiestos.
     *
     * @param dia
     * @param mes
     * @param anho
     * @return True si la fecha es correcta y false en caso contrario
     */
    private boolean comprobarFecha(int dia, int mes, int anho) {
        boolean correcta = true;

        switch (mes) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                if (dia > 31 || dia < 1) {
                    correcta = false;
                }
                break;

            case 4:
            case 6:
            case 9:
            case 11:
                if (dia > 30 || dia < 1) {
                    correcta = false;
                }
                break;
            case 2:
                if (dia > 29 || !(dia > 0 && (dia < 29) || (dia == 29 && esBisiesto(anho)))) {
                    correcta = false;
                }

                break;
            default:
                correcta = false;
        }
        return correcta;
    }

    /**
     * Devuelve el mes en formato texto: Enero,..
     *
     * @return
     */
    private String mesLetra() {
        String retorno;

        //A falta de ver enumeraciones
        //String [] Meses = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
        //return Meses[mes-1];
        switch (mes) {
            case 1:
                retorno = "Enero";
                break;
            case 2:
                retorno = "Febrero";
                break;
            case 3:
                retorno = "Marzo";
                break;
            case 4:
                retorno = "Abril";
                break;
            case 5:
                retorno = "Mayo";
                break;
            case 6:
                retorno = "Junio";
                break;
            case 7:
                retorno = "Julio";
                break;
            case 8:
                retorno = "Agosto";
                break;
            case 9:
                retorno = "Septiembre";
                break;
            case 10:
                retorno = "Octubre";

                break;
            case 11:
                retorno = "Noviembre";
                break;
            case 12:
                retorno = "Diciembre";
                break;

            default:
                throw new AssertionError();
        }
        return retorno;
    }

    /**
     * Mostrar la fecha en formato 1-Enero-2010 p.e.
     */
    public void imprimete() {
        System.out.println(dia + "-" + this.mesLetra() + "-" + anyo);
    }

    /**
     * Mostrar la fecha en formato 1-1-2010 p.e.
     *
     * @param num
     */
    public void imprimete(int num) {
        System.out.println(dia + "-" + mes + "-" + anyo);

    }

    public String getFecha() {
        return (dia + "-" + this.mesLetra() + "-" + anyo);
    }

    public String getFecha(int num) {
        return (dia + "-" + mes + "-" + anyo);
    }

    public String incrementate(int dias) {
        int resto, cociente;

        cociente = dias / 365;
        anyo += cociente;
        resto = dias % 365;

        if (resto > 31) {
            cociente = resto / 31;
            mes += cociente;
            dia += resto % 31;
        } else {
            dia += resto;
        }

        if (dia > 31) {
            mes += 1;
            dia -= 31;
        }
        if (mes > 12) {
            anyo += 1;
            mes = mes % 12;
        }
        return getFecha();
    }

    public void incrementate2(int d) {
        for (int i = 1; i <= d; i++) {
            dia++;

            switch (mes) {
                case 1: // meses de 31 dias
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:

                    if (dia == 32) {
                        mes++;
                        dia = 1;
                    }
                    break;
                case 12:
                    if (dia == 32) {
                        mes = 1;
                        dia = 1;
                        anyo++;
                    }
                    break;
                case 4: // meses de 30 dias
                case 6:
                case 9:
                case 11:
                    if (dia == 31) {
                        mes++;
                        dia = 1;
                    }
                    break;
                case 2: // para anhos bisiestos
                    if (this.esBisiesto(this.anyo)) {
                        if (dia == 30) {
                            mes++;
                            dia = 1;
                        }
                    } else {
                        if (dia == 29) {
                            mes++;
                            dia = 1;
                        }
                    }
                    break;
            }
        }
    }

    public String incrementate3(int diasAIncrementar) {
        int diasRestanMes = 0;
        int diasMes = 0;

        do {
            switch (mes) {
                case 1: // meses de 31 dias
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    diasMes = 31;

                    break;

                case 4: // meses de 30 dias
                case 6:
                case 9:
                case 11:
                    diasMes = 30;
                case 2: // para anhos bisiestos
                    if (this.esBisiesto(anyo)) {
                        diasMes = 29;
                    } else {
                        diasMes = 28;
                    }
                    break;
            }
            diasRestanMes = diasMes - dia;
            if (diasRestanMes >= diasAIncrementar) {
                dia += diasAIncrementar;
            } else {
                dia = 1;
                ++mes;
                if (mes == 13) {
                    anyo++;
                    mes = 1;
                }

            }
            diasAIncrementar -= (diasRestanMes + 1);

        } while (diasAIncrementar > 0);
        return getFecha();
    }
}