1. Cambiar de Date
clase a Calendar
clase
A los programadores les encantó la Date
clase por su simplicidad y compatibilidad con los estándares de Unix, pero como saben, cada rosa tiene sus espinas.
Los programadores querían una Date
clase "inteligente". Y consiguieron lo que querían en la forma de la Calendar
clase. Fue concebido como una forma no solo de almacenar fechas, sino también de realizar operaciones difíciles con fechas.
El nombre completo de la Calendar
clase es java.util.Calendar. No olvide agregarlo a una declaración de importación si decide usarlo en su código.
Puede crear un Calendar
objeto con este comando:
Calendar date = Calendar.getInstance();
getInstance()
El método estático de la Calendar
clase crea un Calendar
objeto inicializado con la fecha actual. El calendario que desea se creará en función de la configuración de la computadora que ejecuta el programa.
O más exactamente, el calendario que obtienes... Eso es porque los humanos en la Tierra no están limitados a un solo calendario. En cambio, usan muchos. Y casi todos ellos están asociados a alguna religión o país. La Calendar
clase admite 3 de ellos:
Calendario | Descripción |
---|---|
Calendario Gregoriano | calendario gregoriano cristiano |
BudistaCalendario | calendario budista |
JaponésImperialCalendario | calendario imperial japonés |
Pero también hay calendarios chino y árabe. Básicamente, trabajar con el tiempo no es tan fácil como parece.
En el calendario chino, el año es oficialmente 4716 al momento de escribir esta lección. Y según el calendario musulmán, el año es 1398. Bienvenido al gran mundo, mi amigo programador.
2. Crear un objeto de calendario
Usaremos el calendario gregoriano, ya que es el más común en el mundo. Al menos hasta que China compre Oracle y haga del calendario chino el principal.
Puede crear un objeto de calendario con cualquier fecha usando una declaración como esta:
Calendar date = new GregorianCalendar(year, month, day);
Sí, tienes que escribir GregorianCalendar
cada vez. En lugar de Calendar
, también puedes escribir GregorianCalendar
, eso también funcionará. Pero escribir solo Calendar
es más corto.
El año debe escribirse completo, por ejemplo, no puede escribir 19 en lugar de 2019. Los meses todavía se numeran desde cero. Pero como antes, los días del mes no se numeran desde cero. ¡Nerds!
Para establecer la hora y la fecha, debe pasar la hora como argumentos adicionales:
... = new GregorianCalendar(year, month, day, hours, minutes, seconds);
Incluso puede pasar en milisegundos si es necesario. Son el parámetro después del número de segundos.
3. Mostrar un objeto de calendario en la pantalla
Si simplemente imprime un objeto de calendario en la pantalla, no estará muy satisfecho con el resultado.
Código |
---|
|
Salida de consola |
|
Lo que hay que tener en cuenta aquí es que un calendario es un calendario, no una fecha : tiene todo tipo de configuraciones que se mostrarán en la pantalla.
Sería apropiado usar un SimpleDateFormat
objeto para mostrar un calendario, pero hasta que lo estudiemos, puedes usar este truco.
Date date = calendar.getTime();
Un Calendar
objeto se puede convertir fácilmente en un Date
objeto y ya sabe cómo mostrar un Date
objeto. Puede usar un código como este para convertir un Calendar
objeto en un Date
:
Usando el getTime()
método:
Código | Salida de consola |
---|---|
|
|
Ese es un asunto bastante diferente, ¿no?
4. Trabajar con elementos de una fecha
Para obtener un elemento específico de una fecha (por ejemplo, el año, mes, ...), la Calendar
clase tiene el get()
método. Es un método único, pero tiene parámetros:
int month = calendar.get(Calendar.MONTH);
Donde calendar
es una Calendar
variable, y MONTH
es un campo constante de la Calendar
clase.
Pasa uno de los Calendar
campos constantes de la clase como argumento al get
método y obtiene el valor deseado como resultado.
Ejemplos
Código | Descripción |
---|---|
|
era (antes o después de la era común) año mes día del mes día de la semana horas minutos segundos |
Para cambiar un elemento de una fecha, utilice el set
método:
calendar.set(Calendar.MONTH, value);
Donde calendar
es una Calendar
variable, y MONTH
es un campo constante de la Calendar
clase.
Cuando trabaja con set
el método, pasa uno de los Calendar
campos constantes de la clase como primer argumento y el nuevo valor como segundo argumento.
Ejemplos
Código | Descripción |
---|---|
|
año = 2019 mes = julio (numerado desde 0) 4º día horas minutos segundos |
5. Constantes de la Calendar
clase
Los campos constantes de la Calendar
clase no se limitan a aquellos para nombrar elementos de una fecha. Parece que hay campos para cada ocasión.
Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);
Por ejemplo, hay campos constantes para referirse a meses:
Y también los días de la semana:
Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
System.out.println("It's Friday");
}
No enumeraremos todo. Simplemente no queremos que se sorprenda si ve constantes como esta en el código.
El uso de constantes hace que el código sea más legible, razón por la cual los programadores las usan. Y los meses están numerados desde cero también para mejorar la legibilidad. O no.
6. Cambiar la fecha en un Calendar
objeto
La Calendar
clase tiene un método que le permite operar en una fecha de manera más inteligente. Por ejemplo, puede agregar un año, un mes o varios días a una fecha. O llévatelos. Este método se llama add()
. Trabajar con él se ve así:
calendar.add(Calendar.MONTH, value);
Donde calendar
es una Calendar
variable, y MONTH
es un campo constante de la Calendar
clase.
Cuando trabaja con add
el método, pasa uno de los Calendar
campos constantes de la clase como primer argumento y como segundo argumento: el nuevo valor que se agregará.
Este es otro método inteligente. Veamos qué tan inteligente es:
Código |
---|
|
Salida de consola |
|
Este método entiende que solo hay 28 días en febrero de 2019, por lo que la fecha resultante es el 1 de marzo.
Ahora vamos a quitar 2 meses! ¿Qué debemos obtener? 27 de diciembre de 2018! Comprobemos ahora.
Para realizar una operación que da como resultado una fecha anterior, debe pasar un valor negativo al add()
método:
Código |
---|
|
Salida de consola |
|
¡Funciona!
Este método tiene en cuenta las diferentes duraciones de los meses, así como los años bisiestos. En definitiva, un gran método. Es exactamente lo que necesitan la mayoría de los programadores que trabajan con fechas.
7. Elementos rodantes de una fecha
Pero a veces hay situaciones en las que no queremos este comportamiento inteligente, por ejemplo, quieres hacer algo en una parte de la fecha sin cambiar todo lo demás.
La Calendar
clase tiene el roll()
método especial para esto. Su firma es como el add()
método, pero este método cambia solo un elemento de la fecha, dejando el resto sin cambios.
Ejemplo:
Código |
---|
|
Salida de consola |
|
Cambiamos el mes, pero el año y la fecha permanecieron sin cambios.
GO TO FULL VERSION