Ir al contenido principal

Calendario en Java con GregorianCalendar


En el programa desarrollado y mostrado en esta oportunidad, se han usado tres clases de la biblioteca de Java: la clase java.util.Date que sirve para crear una fecha actual del sistema, la clase java.text.DateFormat que sirve para dar formato a la fecha, y principalmente la clase java.util.GregorianCalendar que sirve para manipular fechas.

A continuación, se muestra la clase Calendario que usa la clase java.util.GregorianCalendar y permite manipular fechas creando una fecha actual del sistema o una fecha determinada. Además sirve para modificar la fecha, obtener formatos de impresión, saber si un año es bisiesto, y realizar cálculos sobre fechas. Esta clase se puede reutilizar fácilmente desde cualquier otra clase que necesite manipular fechas.

package com.sistemajava;

import java.text.DateFormat;
import java.util.GregorianCalendar;
import java.util.Date;

public class Calendario {
    
    private GregorianCalendar calendario;

    public Calendario() {
        calendario = new GregorianCalendar();
        calendario.setTime(new Date());
    }
    
    public Calendario(Date fecha) {
        calendario = new GregorianCalendar();
        calendario.setTime(fecha);
    }
    
    public Calendario(int dia, int mes, int anno) {
        calendario = new GregorianCalendar();
        calendario.set(GregorianCalendar.DAY_OF_MONTH, dia);
        calendario.set(GregorianCalendar.MONTH, --mes);
        calendario.set(GregorianCalendar.YEAR, anno);        
    }

    public GregorianCalendar getCalendario() {
        return calendario;
    }
    
    public void modificarFecha(Date fecha) {        
        calendario.setTime(fecha);                    
    }
    
    public void modificarDia(int dia) {        
        calendario.set(GregorianCalendar.DAY_OF_MONTH, dia);
    }
    
    public void modificarMes(int mes) {        
        calendario.set(GregorianCalendar.MONTH, --mes);
    }
    
    public void modificarAnyo(int anyo) {        
        calendario.set(GregorianCalendar.YEAR, anyo);                  
    }
    
    public void modificarTiempo(int hora, int minutos, int segundos) {        
        calendario.set(GregorianCalendar.HOUR, hora);
        calendario.set(GregorianCalendar.MINUTE, minutos);
        calendario.set(GregorianCalendar.SECOND, segundos);                 
    }
    
    public Date obtenerFecha() {        
        return calendario.getTime();                    
    }
  
    public String obtenerFormatoAAAA_MM_DD() {
        String dia, mes, anno;        
        dia = "" + calendario.get(GregorianCalendar.DAY_OF_MONTH); 
        mes = "" + (calendario.get(GregorianCalendar.MONTH)+1); 
        anno = "" + calendario.get(GregorianCalendar.YEAR); 
        if(dia.length() == 1)
            dia = "0" + dia;
        if(mes.length() == 1)
            mes = "0" + mes;
        return anno + "-" + mes + "-" + dia; 
    }
    
    public String obtenerFormatoRegular() {
        DateFormat formatoFecha = DateFormat.getDateInstance();
        return formatoFecha.format(calendario.getTime());
    }
    
    public int obtenerAnyo() {        
        return calendario.get(GregorianCalendar.YEAR);                    
    }

    public void adicionarMinutos(int minutos) {
        calendario.add(GregorianCalendar.MINUTE, minutos);
    }
    
    public void adicionarHoras(int horas) {
        calendario.add(GregorianCalendar.HOUR_OF_DAY, horas);
    }
    
    public void adicionarDias(int dias) {
        calendario.add(GregorianCalendar.DAY_OF_MONTH, dias);                   
    }
    
    public void adicionarMeses(int meses) {
        calendario.add(GregorianCalendar.MONTH, meses);
    }
    
    public void adicionarAnyos(int anyos) {
        calendario.add(GregorianCalendar.YEAR, anyos);
    }
    
    public boolean esFechaIgual(Calendario nuevoCalendario) {  
        return obtenerFormatoRegular().equals(nuevoCalendario.obtenerFormatoRegular());       
    }
    
    public boolean esFechaHoraMenor(Calendario nuevoCalendario) {                
        return calendario.before(nuevoCalendario.getCalendario());
    }
    
    public boolean esFechaHoraMayor(Calendario nuevoCalendario) {        
        return calendario.after(nuevoCalendario.getCalendario());
    }
    
    public boolean esFechaHoraIgual(Calendario nuevoCalendario) {        
        return calendario.equals(nuevoCalendario.getCalendario());
    }
    
    public long diferenciaEnMilisegundos(Calendario calendarioAnterior){
        return calendario.getTimeInMillis() - calendarioAnterior.getCalendario().getTimeInMillis();
    }
    
    public double diferenciaEnSegundos(Calendario calendarioAnterior){
        return diferenciaEnMilisegundos(calendarioAnterior) / 1000;
    }
    
    public double diferenciaEnMinutos(Calendario calendarioAnterior){
        return diferenciaEnSegundos(calendarioAnterior) / 60;
    }
    
    public double diferenciaEnHoras(Calendario calendarioAnterior){
        return diferenciaEnMinutos(calendarioAnterior) / 60;
    } 
    
    public double diferenciaEnDias(Calendario calendarioAnterior){
        return diferenciaEnHoras(calendarioAnterior) / 24;
    } 
    
    public double diferenciaEnAnyos(Calendario calendarioAnterior){
        return diferenciaEnDias(calendarioAnterior) / 365;
    }
    
    public int rangoEnAnyos(Calendario calendarioAnterior){
        int anyoActual, anyoAnterior;      
        anyoActual = calendario.get(GregorianCalendar.YEAR);
        anyoAnterior = calendarioAnterior.getCalendario().get(GregorianCalendar.YEAR);
        return anyoActual - anyoAnterior;
    }
    
    public boolean esAnyoBisiesto() {        
        return calendario.isLeapYear(obtenerAnyo());
    }
    
}

También se ha desarrollado la clase ReportarCalendario que permite crear objetos del tipo Calendario, imprimir fechas en diferentes formatos, comparar fechas, e imprimir cálculos entre fechas.

package com.sistemajava;

public class ReportarCalendario {
    
    public static void main(String[] args) {   
        System.out.println("REPORTE DE CALENDARIO");
        Calendario calendario = new Calendario(); 
        System.out.println("Fecha actual en formato aaaa-mm-dd:  " + calendario.obtenerFormatoAAAA_MM_DD());                
        calendario.modificarMes(3);
        System.out.println("Fecha modificada en formato regular: " + calendario.obtenerFormatoRegular());
        calendario.adicionarDias(15);
        System.out.println("Fecha modificada mas 15 días:        " + calendario.obtenerFormatoRegular());
        calendario.adicionarDias(-2);
        System.out.println("Fecha modificada menos 2 días:       " + calendario.obtenerFormatoRegular());
        calendario.adicionarMeses(3);
        System.out.println("Fecha modificada mas 3 meses:        " + calendario.obtenerFormatoRegular());
        calendario.adicionarAnyos(4);
        System.out.println("Fecha modificada mas 4 años:         " + calendario.obtenerFormatoRegular());       
        Calendario calendarioAnterior = new Calendario(20,9,2010);
        System.out.println("Fecha anterior:                      " + calendarioAnterior.obtenerFormatoRegular());
        if(calendario.esFechaHoraMayor(calendarioAnterior))
            System.out.println("La fecha modificada es mayor a la fecha anterior considerando la hora");
        if(calendario.esFechaHoraMenor(calendarioAnterior))
            System.out.println("La fecha modificada es menor a la fecha anterior considerando la hora");
        if(calendario.esFechaIgual(calendarioAnterior))
            System.out.println("La fecha modificada es igual a la fecha anterior sin considerar la hora");
        System.out.println("Diefrencia de tiempos entre la fecha modificada y la fecha anterior");
        System.out.println("Diferencia en milisegundos:          " + calendario.diferenciaEnMilisegundos(calendarioAnterior));
        System.out.println("Diferencia en segundos:              " + calendario.diferenciaEnSegundos(calendarioAnterior));
        System.out.println("Diferencia en minutos:               " + calendario.diferenciaEnMinutos(calendarioAnterior));
        System.out.println("Diferencia en horas:                 " + calendario.diferenciaEnHoras(calendarioAnterior));
        System.out.println("Diferencia en días:                  " + calendario.diferenciaEnDias(calendarioAnterior));
        System.out.println("Diferencia en años:                  " + calendario.diferenciaEnAnyos(calendarioAnterior));
        System.out.println("Rango de años:                       " + calendario.rangoEnAnyos(calendarioAnterior));
        if(calendario.esAnyoBisiesto())
            System.out.println("El año " + calendario.obtenerAnyo() + " es bisiesto");
        else
            System.out.println("El año " + calendario.obtenerAnyo() + " no es bisiesto");
    }
    
}

El resultado de ejecutar el programa se muestra en la siguiente figura:



Comentarios

Entradas populares de este blog

Manejo de fechas en Java 8 con LocalDate

En el programa desarrollado y mostrado en esta oportunidad, se han usado tres clases de la biblioteca de Java 8: la clase  java.time.Period  que sirve para determinar rangos como el total de años entre dos fechas, la clase  java.time.format.DateTimeFormatter  que sirve para dar diversos formatos a la fecha, y principalmente la clase  java.time. LocalDate   que es un objeto de fecha y hora inmutable que representa una fecha, a menudo visto como año-mes-día, además permite realizar de forma simple diversas operaciones de fecha.

La clase Cuadrado

Se presenta la implementación de una clase denominada Cuadrado . Esta clase representa a la figura geométrica Cuadrado en donde tiene como único atributo el lado. El atributo lado de la clase es una característica de cualquier objeto de tipo Cuadrado. Los objetos del tipo Cuadrado que se instancien o se creen tendrán un determinado valor en su atributo lado. Con el valor del atributo lado se podrá calcular tres tipos de mediciones como el área, el perímetro y la diagonal. Para cada cálculo se crea un método en la clase Cuadrado.