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.

Formato de fechas en Java con SimpleDateFormat

En el programa desarrollado y mostrado en esta oportunidad, se han usado dos clases de la biblioteca de Java: la clase  java.util.Date  que sirve para crear una fecha actual del sistema, y la clase  java.text.SimpleDateFormat  que sirve para dar diversos formatos de impresión a la fecha.