Trabajar Con Fechas en Java_capitulo II
-
Upload
andonilosada3501 -
Category
Documents
-
view
221 -
download
0
description
Transcript of Trabajar Con Fechas en Java_capitulo II
Sitio: Copyright is for losers at http://carloszuluaga.w ikidot.com Código de la página: Manejo de fechas en Java II at
http://carloszuluaga.w ikidot.com /articulos:m anejo-de-fechas-en-java-ii
M anejo de fechas en Java II
Leer M anejo de Fechas en Java (I)
Por Carlos Zuluaga M ayo 1 de 2007
Operaciones
No todo debe ser tan com plejo y abstracto com o lo es con las clases que
vim os anteriorm ente. Java posee otras clases que nos facilitan realizar
operaciones com o sum a, resta, obtener un día y hora exactos, entre otras.
Estas funcionalidades las obtenem os de dos clases en particular; una es
abstracta: java.util.Calendar (a partir de ahora m e referiré a ella com o
Calendar) y perm ite obtener cam pos enteros com o día, m es y año de objetos
de tipo java.util.Date o que hereden de él. La otra
java.util.GregorianCalendar (a partir de ahora sim plem ente
GregorianCalendar) es una im plem entación del calendario gregoriano que es
usado en casi todo el m undo (es el que conocem os).
CalendarSegún la docum entación del API de java, la clase Calendar es una clase
abstracta base para convertir entre un objeto de tipo Date (java.util.Date) y
un conjunto de cam pos enteros com o YEAR (año), M O NTH (m es), DAY (día),
HO UR (hora), etc. Una subclase de Calendar representa una fecha de
acuerdo a las reglas de un calendario específico. La plataform a provee una
subclase concreta de Calendar: GregorianCalendar. Futuras subclases
podrían representar varios tipos de calendarios lunares usados en diferentes
lugares del m undo.
Esto puede haber sonado un tanto abstracto pero no nos confundam os. La
clase Calendar tiene m ucho del com portam iento que esperaríam os de la clase
java.util.Date, es decir, cuando obtenem os una instancia de la clase Calendar
obtenem os un instante de tiem po específico con gran precisión sim ilar a lo
que obtenem os con la clase date. Sí es cierto, podem os decir aquí que los
m ilisegundos juegan un papel fundam ental en esta clase; pero el verdadero
sentido de la clase Calendar no es obtener un instante de tiem po sino
extraerle datos.
Recordem os que la clase java.util.Date tiene m étodos que perm iten obtener
el año, m es y día, pero estos m étodos están obsoletos precisam ente por que
para eso existe Calendar y de hecho cuando usam os el m étodo getYear() de
la clase java.util.Date esta recurre a las funcionalidades que posee la clase
Página 1 de 7Copyright is for losers: Manejo de fechas en Java II
27/02/2015http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...
Calendar.
Hay que m encionar tam bién que obtener un instante de tiem po específico y
diferente del actual es suprem am ente sencillo con esta clase, indicándole
sim plem ente el día, m es y año con que se desea trabajar, o se puede
especificar aún m ás dando hora, m inuto y segundo deseado. Veam os:
El m étodo getInstance() de la clase nos devuelve una subclase de Calendar
con el tiem po ajustado a la hora actual, y usam os el m étodo set(args… ) para
forzarlo a tom ar la fecha deseada:
Calendar ahoraCal = Calendar.getInstance(); System.out.println(ahoraCal.getClass()); ahoraCal.set(2004,1,7); System.out.println(ahoraCal.getTime()); ahoraCal.set(2004,1,7,7,0,0); System.out.println(ahoraCal.getTime());
La prim era línea devuelve una instancia de GregorianCalendar con la fecha y
hora actual y el m étodo getTim e() retorna un objeto de tipo java.util.Date
que se m uestra en consola posteriorm ente.
En la tercera línea se usa el m étodo set para ajustar la fecha al "7 de enero
de 2004" y en la quinta ponem os la m ism a fecha pero esta vez ajustando
tam bién la hora, m inutos y seg qundos, com oueda: "7 de la noche del 7 de
enero de 2004".
La salida en consola será (note que tiene el form ato de java.util.Date):
class java.util.GregorianCalendar
Sat Feb 07 19:55:47 GMT-05:00 2004
Sat Feb 07 07:00:00 GMT-05:00 2004
Extraer los datosLa clase Calendar tiene un único m étodo get para obtener todos sus datos
para lo cual se ayuda de una serie de atributos constantes que perm iten
obtener o ajustar un atributo determ inado de la fecha; los m ás im portantes
son (al lado los valores que representan):
-YEAR: Año.-MONTH: M es.
-DATE, DAY_OF_MONTH: Día del m es.
-DAY_OF_WEEK: Día de la sem ana entre 1 (M O NDAY) y 7 (SATURDAY).
-HOUR: Hora antes o después del m edio día (en intervalos de 12 horas).
-HOUR_OF_DAY: Lo hora absoluta del día (en intervalos de 24 horas).-MINUTE: El m inuto dentro de la hora.
-SECOND: El segundo dentro del m inuto.
Página 2 de 7Copyright is for losers: Manejo de fechas en Java II
27/02/2015http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...
Están tam bién los atributos que representan los m eses, com o: JANUARY,
M ARCH, JUNE, DECEM BER, etc. que van desde 0 (JANUARY) hasta 11
(DECEM BER).
Tam bién hay atributos que representan los días: SUNDAY, TUESDAY,
SATURDAY, etc. estos em piezan con 1 (SUNDAY) y van hasta 7 (SATURDAY).
Hay m ás atributos pero con estos es suficiente para los objetivos de este
artículo, si deseas concerlos todos recurre a la docum entación del lenguaje.
Para extraer algún atributo se usa el m étodo get pasándole com o parám etro
alguna de las constantes que vim os anteriorm ente y el m étodo devuelve
siem pre un dato de tipo int; así para obtener el año , m es, día y hora,
usaríam os el siguiente código:
System.out.println("ANYO: "+ahoraCal.get(Calendar.YEAR)); System.out.println("MES: "+ahoraCal.get(Calendar.MONTH)); System.out.println("DIA: "+ahoraCal.get(Calendar.DATE)); System.out.println("HORA: "+ahoraCal.get(Calendar.HOUR)); if (ahoraCal.get(Calendar.MONTH) == Calendar.JUNE){ System.out.println("ES JUNIO"); }else{ System.out.println("NO ES JUNIO"); }
Si el objeto tiene la fecha equivalente a 5:30 p.m . del 22 de junio de 2004 se
ve la siguiente salida:
ANYO: 2004
MES: 5
DIA: 22
HORA: 5
ES JUNIO
Modificar un atributoM odificar un atributo de Calendar es tan sencillo com o obtenerlo, solam ente
es necesario usar el m étodo set(int atributo, int valor), en donde atributo es
una de las constante m encionadas anteriorm ente y valor es la cantidad que
se le quiere asignar. Por ejem plo: ahoraCal.set
(Calendar.M O NTH,Calendar.JANUARY) o ahoraCal.set(Calendar.YEAR, 1980)
ajustarían la fecha alm acenada en el objeto ahoraCal a enero o al año 1980
sin m odificar ninguno de los otros atributos.
Aclarem os esto con un ejem plo. M i cum pleaños es en octubre 27 :-), y deseo
saber que día lo celebraré en el 2010; para eso obtengo una instancia de
Calendar (que siem pre devuelve un objeto del tipo GregorianCalendar) y la
Página 3 de 7Copyright is for losers: Manejo de fechas en Java II
27/02/2015http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...
ajusto hasta el 27 de octubre de 2010, luego obtengo el nom bre del dia,
veam os:
Calendar cumpleCal = Calendar.getInstance(); cumpleCal.set(2010,9,27); //La hora no me interesa y recuerda quint dia = cumpleCal.get(Calendar.DAY_OF_WEEK); System.out.println(dia); //Día 4 = WEDNESDAY = MIÉRCOLES
La salida es: 4, lo que quiere decir que en el 2010 el 27 de octubre será un
día m iércoles (así que probablem ente lo celebre el viernes 29 :-));
Clase GregorianCalendar y operaciones
Realizar operaciones com o sum ar o restar días no es algo que dependa
directam ente de Calendar sino m ás bien de una subclase de esta que
im plem ente algún tipo de calendario usado, pues no todos los calendarios
tienen 12 m eses ni años de 365 días com o el que nosotros (en casi todo
occidente) usam os.
Este calendario usado en occidente, llam ado gregoriano fue adoptado por
prim era vez en 1582 por el im perio rom ano (o aproxim adam ente) y
posteriorm ente se fue adoptando en m uchos otros países, por ejem plo
1752 en Gran Bretaña y 1918 en Rusia.
A grandes rasgos sabem os que el calendario gregoriano consta de años que
son definidos por cada traslación (vuelta de la tierra alrededor del sol), cada
año tiene doce m eses de los cuales 7 tienen 31 días, 4 tienen 30 días y 1
tiene 28 días excepto en años bisiestos que tiene 29. Estos años bisiestos se
im plantaron para corregir el desfase que tenem os cada cuatro años (un año
real dura 365 días y 6 horas aproxim andam ente), regla com pleta para los
años bisiestos según en calendario gregoriano es la siguiente:
"Un año es bisiesto si es divisible por 4, a menos que sea divisible por 100 y no por 400".Todo esto quizá suene un poco tonto, pero es absolutam ente necesario
tenerlo claro para entender el funcionam iento de la clase GregorianCalendar.
GregorianCalendar es una subclase de Calendar y es la im plem entación
directa del calendario gregoriano (de hecho es la única im plem entación de un
calendario en jdk1.4) tal y com o lo conocem os hoy día. Es con esta clase con
la que podem os sum ar 2 ó 3 días a una fecha sin preocuparnos por
desbordam ientos o recalcular m eses o años, pues ella lo hace
autom áticam ente tom ando en cuenta las reglas en los párrafos anteriores.
De igual form a podem os obtener inform ación com o el día de la sem ana o la
sem ana del año que fue una fecha determ inada.
Página 4 de 7Copyright is for losers: Manejo de fechas en Java II
27/02/2015http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...
Los métodos roll() y add()Anteriorm ente vim os los m étodos set() y get() de la clase Calendar para
obtener fechas y los datos de esas fechas, ahora verem os los m étodos add()
y roll() que nos perm iten avanzar un tiem po exacto sobre los datos obtenidos
anteriorm ente.
El m étodo add(CO NSTATE, valor) sum a algebraicam ente valor a una fecha;
el valor a sum ar asum e el significado dado por CO NSTANTE, que es una de
las definidas para la clase y que se m encionaron en la sección anterior
(M O NTH, YEAR, SECO ND, etc).
Por ejem plo agreguem os 3 días y 2 m eses a la fecha actual:
Calendar hoy = Calendar.getInstance(); hoy.add(Calendar.DATE, 3); hoy.add(Calendar.MONTH, 2); System.out.println(hoy.getTime());
Ahora restem os 5 años y 50 días (Prúebalo en tu PC):
Calendar hoy = Calendar.getInstance(); hoy.add(Calendar.YEAR, -5); hoy.add(Calendar.DATE, -50); System.out.println(hoy.getTime());
¿Qué, restar 50 días?Pues sí, resulta que la clase GregorianCalendar es “ inteligente” al m om ento
de hacer estos cálculos y se basa en ciertas reglas (2 según la
docum entación) para realizar estas operaciones; tal y com o nosotros lo
haríam os al sum ar 50 días, cuando lleguem os al final del m es actual
em pezam os a contar a partir del m es siguiente y lo m ism o si cam biara el
año, es decir, cuando llegue al lím ite superior o inferior de uno de estos
intervalos se em pezará a afectar el intervalo siguiente según la lógica de la
operación.
Para aclarar lo anterior debem os conocer el orden de los cam pos que se han
m encionado en el artículo (solo pondré los m ás significativos); aquí van en
orden descendente:
YEARMONTHDATE, DAY_OF_MONTHHOURMINUTESECONDCuando estam os sum ando los cam pos se afectan de abajo hacia arriba
Página 5 de 7Copyright is for losers: Manejo de fechas en Java II
27/02/2015http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...
(SECO ND – YEAR) y restando el orden es inverso (YEAR – SECO ND), así que
al m om ento de restar 50 días se decrem enta el atributo DAY_O F_M O NT (o
DATE) hasta 1, luego se decrem enta en 1 el atributo M O NTH y
DAY_O F_M O NTH inicia en el núm ero de días del m es; si antes de
decrem entar M O NTH está en su lím ite inferior (JANUARY) YEAR tam bién debe
ser recalculado (dism inuye en 1) y M O NTH regresa a su lím ite superior al
igual que DATE.
Q ue enredo!
Es cierto, todo esto puede parecer un laberinto (especialm ente por que no
m e explico bien), pero estoy seguro que con un poco de código se despejará
el panoram a.
Para todos los ejem plos partirem os del 10 de noviem bre de 1998 a las
7:00am .
Calendar cal = Calendar.getInstance(); cal.set(1998,10,10,7,0,0);
cal.add(Calendar.SECOND,52); cal.add(Calendar.HOUR, 2); cal.add(Calendar.MONTH, -3); cal.add(Calendar.YEAR,1); //Así la fecha seía 1999/8/10 09:00:52 (Agosto 10 de 1999)System.out.println(cal.getTime());
Aquí ningún atributo llegó a su lím ite superior o inferior y por tanto la nueva
fecha se calcula m uy fácilm ente.
Para ver com o incide una sola operación en varios atributos, sum arem os a la
fecha 70 m inutos y 22 días; com o el lím ite superior de los m inutos (60) es
sobrepasado, se debe increm entar el atributo inm ediatam ente superior
(HO UR), igual que al sobrepasar el lím ite de días para el m es (noviem bre
tiene 30 días) se increm enta el año. Así finalm ente tendrem os el 2 de
diciem bre de 1998 a las 8:10 am .
cal.add(Calendar.MINUTE, 70); cal.add(Calendar.DATE, 22); //Así la fecha seía 1998/12/2 08:10:00 (Diciembre 2 de 1998)System.out.println(cal.getTime());
Método roll(CONSTATE, valor)Esté m étodo tiene un funcionam iento sim ilar a add() excepto por que no
m odifica ningún otro atributo, es decir, cuando el atributo dado por
CO NSTANTE llega a su lím ite inferior o superior cam bia al lím ite contrario
Página 6 de 7Copyright is for losers: Manejo de fechas en Java II
27/02/2015http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...
pero sin m odificar sus atributos siguientes. Seguram ente suena un tanto
extraño este funcionam iento, pues con el m étodo set() podem os asignar un
valor directam ente; según la docum entación este m étodo se hizo para
facilitar la funcionalidad en las interfaces de usuario donde hay que
especificar una fecha y tienen botones para increm entar o decrem entar
alguno de los datos (creo que todos los hem os visto).
Si en el ejem plo anterior en vez de add() usam os roll() ya no obtendrem os
Diciem bre 2 de 1998 a 8:10 am , sino Noviem bre 2 de 1998 a las 7:10 am .
Note que solo cam bian los valores que se especificaron directam ente.
cal.roll(Calendar.MINUTE, 70); cal.roll(Calendar.DATE, 22); //Así la fecha seía 1998/11/2 07:10:00 (Noviembre 2 de 1998)System.out.println(cal.getTime());
En verdad el uso de roll no es m uy com ún excepto pues en am bientes
gráficos, los m étodos que en verdad deben ser considerados, estudiados y
probados son set(), get() y add().
Esto es todo por esta entrega, en el próxim o artículo verem os com o
form atear una fecha para m ostrarla de form a com prensible, el parseo y
algunos detalles no tan com unes de las clases Calendar y GregorianCalendar.
revisión de página: 2, últim a edición: 20 Jan 2010, 06:41 (1864 days atrás)
Unless stated otherw ise Content of this page is licensed under Creative Com m ons Attribution-ShareAlike 3.0 License
Página 7 de 7Copyright is for losers: Manejo de fechas en Java II
27/02/2015http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...