Trabajar Con Fechas en Java_capitulo II

7
Sitio: Copyright is for losersathttp://carloszuluaga.w ikidot.com Códigodelapágina: Manejo de fechas en Java IIat http://carloszuluaga.w ikidot.com /articulos:m anejo-de-fechas-en-java-ii M anejodefechasenJavaII LeerM anejodeFechasenJava(I) Por CarlosZuluagaMayo1de2007 Operaciones Notododebesertancom plejoyabstractocom oloesconlasclasesque vim osanteriorm ente.Javaposeeotrasclasesquenosfacilitanrealizar operacionescom osum a,resta,obtenerundíayhoraexactos,entreotras. Estasfuncionalidadeslasobtenem osdedosclasesenparticular;unaes abstracta:java.util.Calendar(apartirdeahoram ereferiréaellacom o Calendar)yperm iteobtenercam posenteroscom odía,m esyañodeobjetos detipojava.util.Dateoqueheredendeél.Laotra java.util.GregorianCalendar(apartirdeahorasim plem ente GregorianCalendar)esunaim plem entacióndelcalendariogregorianoquees usadoencasitodoelm undo(eselqueconocem os). Calendar Segúnladocum entacióndelAPIdejava,laclaseCalendaresunaclase abstractabaseparaconvertirentreunobjetodetipoDate(java.util.Date)y unconjuntodecam posenteroscom oYEAR(año),M O NTH(m es),DAY(día), HOUR(hora),etc.UnasubclasedeCalendarrepresentaunafechade acuerdoalasreglasdeuncalendarioespecífico.Laplataform aproveeuna subclaseconcretadeCalendar:GregorianCalendar.Futurassubclases podríanrepresentarvariostiposdecalendarioslunaresusadosendiferentes lugaresdelm undo. Estopuedehabersonadountantoabstractoperononosconfundam os.La claseCalendartienem uchodelcom portam ientoqueesperaríam osdelaclase java.util.Date,esdecir,cuandoobtenem osunainstanciadelaclaseCalendar obtenem osuninstantedetiem poespecíficocongranprecisiónsim ilaralo queobtenem osconlaclasedate.Síescierto,podem osdeciraquíquelos m ilisegundosjueganunpapelfundam entalenestaclase;peroelverdadero sentidodelaclaseCalendarnoesobteneruninstantedetiem posino extraerledatos. Recordem osquelaclasejava.util.Datetienem étodosqueperm itenobtener elaño,m esydía,peroestosm étodosestánobsoletosprecisam enteporque paraesoexisteCalendarydehechocuandousam oselm étodogetYear()de laclasejava.util.Dateestarecurrealasfuncionalidadesqueposeelaclase Página 1 de 7 Copyright is for losers: Manejo de fechas en Java II 27/02/2015 http://carloszuluaga.wikidot.com/printer--friendly//articulos:manejo-de-fechas-en-java...

description

FECHAS EN JAVA

Transcript of Trabajar Con Fechas en Java_capitulo II

Page 1: 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...

Page 2: Trabajar Con Fechas en Java_capitulo II

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...

Page 3: Trabajar Con Fechas en Java_capitulo II

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...

Page 4: Trabajar Con Fechas en Java_capitulo II

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...

Page 5: Trabajar Con Fechas en Java_capitulo II

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...

Page 6: Trabajar Con Fechas en Java_capitulo II

(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...

Page 7: Trabajar Con Fechas en Java_capitulo II

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...