Java Calendar
La clase proporciona varios métodos para manipular información temporal. Además de recuperar la fecha y hora actual del sistema, también habilita la funcionalidad para la aritmética de fecha y hora.
Agregar un período de tiempo (meses y días) a una fecha
Suponga que desea agregar un período de tiempo a una fecha. ¿Como lo haras? Por ejemplo, ¿qué pasa si el marco de tiempo es de cuatro meses y la fecha a la que se debe agregar el marco de tiempo es hoy mismo? Para ello, tendremos que calcular el número de días en el mes actual y en los meses intermedios. Además, tendrás que cuidar el fin de año y el año bisiesto para llegar al resultado final. Bastante complejo !!
Aquí es donde Clase de calendario viene y puede proporcionarle una API fácil de usar para implementar un cálculo tan complejo con facilidad.
Hagamos el problema anterior un poco más complejo. Ahora, suponga que queremos agregar cuatro meses y 5 días al 6 de marzo de 2009. Entonces, ¿cómo ayudará la clase de Calendario? Veamos ..
Ejemplo:
package calendarusage; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public class CalendarUsage { /** * main class * @param args */ public static void main(String[] args) { CalendarUsage calUsage = new CalendarUsage(); calUsage.performCalendarArithmetic(); } /** * This method performs Calendar Arithmetic by adding 4 months * and 5 days to 6th March 2009 and prints in two date formats * */ private void performCalendarArithmetic() { //Set calendar to 6th March 2009 Calendar cal = new GregorianCalendar(2009, Calendar.MARCH, 6); //Add 4months and 5days cal.add(Calendar.MONTH, 4); cal.add(Calendar.DAY_OF_MONTH, 5); //Define Format of date SimpleDateFormat sdf = new SimpleDateFormat("d MMM yyyy"); String date = sdf.format(cal.getTime()); System.out.println(date); //Define another Format of date sdf = new SimpleDateFormat("d MMM yyyy hh:mm aaa"); date = sdf.format(cal.getTime()); System.out.println(date); } }
En el método performCalendarArithmetic()
, primero establecemos la fecha como 6th March 2009
y luego agregamos 4 meses a los meses a los que conducirá el calendario 6th July
. Hemos añadido 5 días a esta fecha. El resultado es 11th July 2009
.
La salida del código anterior es:
11 Jul 2009 11 Jul 2009 12:00 AM
Otro caso: ahora, supongamos que queremos agregar 12 hours 34 minutes
por 6th March 2009
. Podemos hacerlo de la siguiente manera:
Ejemplo:
package calendarusage; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public class CalendarUsage { /** * main class * @param args */ public static void main(String[] args) { CalendarUsage calUsage = new CalendarUsage(); calUsage.addTime(); } private void addTime() { //set calendar to 6th March 2009 Calendar calendar = new GregorianCalendar(2009,Calendar.MARCH,6, 1,0); System.out.println("Current Date::"); SimpleDateFormat sdf = new SimpleDateFormat("d MMM yyyy hh:mm aaa"); String date = sdf.format(calendar.getTime()); System.out.println(date); // add 14h 55min calendar.add(Calendar.HOUR,12); calendar.add(Calendar.MINUTE,34); System.out.println(date); } }
La salida es:
Current Date:: 6 Mar 2009 01:00 AM 6 Mar 2009 01:00 AM
Restar períodos de tiempo (meses, días, horas, minutos) de la fecha
La resta es lo mismo que la suma. El único cuidado que debe tenerse es que el valor se considere negativo. Supongamos que queremos restar 4 months,5 days,12 hours and 24 minutes
. Esto puede hacerse de la siguiente manera:
Ejemplo:
package calendarusage; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public class CalendarUsage { /** * main class * @param args */ public static void main(String[] args) { CalendarUsage calUsage = new CalendarUsage(); calUsage.subtractTime(); } private void subtractTime() { //set calendar to 6th March 2009 Calendar calendar = new GregorianCalendar(2009, Calendar.MARCH, 6, 1, 0); System.out.println("Current Date::"); SimpleDateFormat sdf = new SimpleDateFormat("d MMM yyyy hh:mm aaa"); String date = sdf.format(calendar.getTime()); System.out.println(date); //Subtract 4 months,5 days,12 hours and 24 minutes calendar.add(Calendar.MONTH, -4); calendar.add(Calendar.DAY_OF_MONTH, -5); calendar.add(Calendar.HOUR, -12); calendar.add(Calendar.MINUTE, -24); System.out.println("After subtracting 4 months,5 days,12 hours and 24 minutes::"); date = sdf.format(calendar.getTime()); System.out.println(date); } }
La salida es:
Current Date:: 6 Mar 2009 01:00 AM After subtracting 4 months,5 days,12 hours and 24 minutes:: 31 Oct 2008 12:36 PM
Ver el objeto Calendario se encarga automáticamente de configurar el año.
Laminación
En el último ejemplo, vimos que el objeto Calendario se encargaba automáticamente de ajustar el año en el que se produjo un desbordamiento. Sin embargo, puede haber casos en los que no queramos que esto suceda. En ese caso, Calendar
La clase proporciona un método llamado roll()
.
Mira como funciona:
Ejemplo:
package calendarusage; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public class CalendarUsage { /** * main class * @param args */ public static void main(String[] args) { CalendarUsage calUsage = new CalendarUsage(); calUsage.roll(); } private void roll() { //initialize calendar Calendar calendar = new GregorianCalendar(2008, Calendar.DECEMBER,1); System.out.println("Starting date is: "); SimpleDateFormat sdf = new SimpleDateFormat("d MMM yyyy"); String date = sdf.format(calendar.getTime()); System.out.println(date); System.out.println("After rolling 1 month, ending date is: "); calendar.roll(Calendar.MONTH, 1); date = sdf.format(calendar.getTime());; System.out.println(date); } }
La salida es:
Starting date is: 1 Dec 2008 After rolling 1 month, ending date is: 1 Jan 2008
Tenga en cuenta que el año no ha cambiado. Normalmente, si agregamos un mes al 1 de diciembre de 2008, la fecha resultante sería el 1 de enero de 2009. Sin embargo, cuando usamos el método roll (), solo cambiaba el mes sin ajustar automáticamente el año.
Comparar fechas usando el método compareTo ()
La clase Calendar tiene un método llamado compareTo()
que le permite comparar dos fechas para encontrar la anterior.
Vuelve:
1. Un valor menor que cero si la fecha y hora del objeto Calendario de entrada son posteriores a las del objeto Calendario que realiza la llamada.
2. Un valor mayor que cero si lo contrario es cierto
3. Un valor de 0 si los dos objetos Calendario representan la misma fecha.
Ejemplo:
package calendarusage; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public class CalendarUsage{ public static void main(String[] args) { // initialize two calendars Calendar calendar1 = new GregorianCalendar(2007,Calendar.JANUARY,1,0,0,0); Calendar calendar2 = new GregorianCalendar(2007,Calendar.JANUARY,1,0,1,0); // define date format String date1 = null; String date2 = null; SimpleDateFormat sdf = new SimpleDateFormat("d MMM yyyy hh:mm aaa"); // compare dates if((calendar1.compareTo(calendar2)) < 0) { date1 = sdf.format(calendar1.getTime()); date2 = sdf.format(calendar2.getTime()); } else { date1 = sdf.format(calendar2.getTime()); date2 = sdf.format(calendar1.getTime()); } System.out.println(date1 + " occurs before " + date2); System.out.println(date2 + " occurs after " + date1); } }
Aquí está el resultado:
1 Jan 2007 12:00 AM occurs before 1 Jan 2007 12:01 AM 1 Jan 2007 12:01 AM occurs after 1 Jan 2007 12:00 AM
Referencia:
http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html