fechas en java

9
Java: Manejo y formateo de Fechas DateFormat y SimpleDateFormat Java cuenta el número de milisegundos desde el primero de enero de 1970. Esto significa, que por ejemplo, el 2 de Enero de 1970 empezó 86400000 milisegundos después. Asimismo, el 31 de Diciembre de 1969 empezó 86400000 milisegundos antes que el 1 de enero de 1970. La clase Date de Java toma nota de esos milisegundos como un valor Long y como este un número con signo, las fechas pueden ser expresadas antes y después del comienzo del 1 de enero de 1970. La clase Date La clase Date, encontrada en el paquete java.util, encapsula un valor Long representando un momento específico en el tiempo. Un constructor útil es Date(), el cual crea un objeto Date teniendo por valor el día, hora, etc del momento en el cual fue creado. El método getTime()devuelve un valor Long de un objeto Date. En el ejemplo siguiente, usamos el constructor Date()para crear una fecha basada en su ejecución y usamos el método getTime() para ver el número de milisegundos que ese objeto Date representa. Vemos un Ejemplo: 1 2 3 4 5 6 7 8 9 import java.util.*; public class Now { public static void main(String[] args) { Date now = new Date(); long nowLong = now.getTime(); System.out.println("El valor es: " + nowLong); } } Obtendremos: 1344261272112 Cuando ejecutamos el programa, dependiendo del día en que lo estemos ejecutando nos va a dar un valor determinado (1344261272112). Ahora ¿cómo podemos formatear ese valor para que sea un poco más entendible a simple vista y sin tener que tener una calculadora a mano?. Clase DateFormat

Upload: john1975

Post on 11-Dec-2015

214 views

Category:

Documents


0 download

DESCRIPTION

java

TRANSCRIPT

Page 1: Fechas en Java

Java: Manejo y formateo de Fechas DateFormat y SimpleDateFormat

Java cuenta el número de milisegundos desde el primero de enero de 1970.   Esto significa, que por ejemplo, el 2 de Enero de 1970 empezó 86400000 milisegundos después. Asimismo, el 31 de Diciembre   de   1969   empezó   86400000  milisegundos   antes   que   el   1   de   enero   de   1970.   La clase Date de Java toma nota de esos milisegundos como un valor Long y como  este un número con signo, las fechas pueden ser expresadas antes y después del comienzo del 1 de enero de 1970. La clase DateLa  clase Date,   encontrada  en  el  paquete java.util,   encapsula  un  valor  Long   representando  un momento  específico  en  el  tiempo.  Un  constructor  útil  es Date(),   el   cual   crea  un  objeto  Date teniendo   por   valor   el día, hora, etc   del   momento   en   el   cual   fue   creado.   El método getTime()devuelve un valor Long de un objeto Date. En el ejemplo siguiente, usamos el constructor Date()para   crear   una   fecha   basada   en   su   ejecución   y   usamos   el método getTime() para ver el número de milisegundos que ese objeto Date representa.

Vemos un Ejemplo:

123456789

import java.util.*; public class Now { public static void main(String[] args) { Date now = new Date(); long nowLong = now.getTime(); System.out.println("El valor es: " + nowLong); } }

Obtendremos:1344261272112Cuando ejecutamos el programa, dependiendo del día en que lo estemos ejecutando nos va a dar un valor determinado (1344261272112). Ahora ¿cómo podemos formatear ese valor para que sea un poco más entendible a simple vista y sin tener que tener una calculadora a mano?. Clase DateFormat

Un propósito  de   la  clase DateFormat es  crear  Strings  en   formas  en  que   los  humanos  puedan entenderlas y manejarlas fácilmente. Sin embargo,  dado por las diferencias culturales, no todas las personas ven las fechas de la misma forma. En Argentina preferimos ver “25 de diciembre 2012”,  mientras  que en Estados  Unidos  “Diciembre 25,  2012”.  Por  eso,  cuando una  instancia deDateFormat es creada sin ningún parámetro toma el valor por default que tiene la máquina donde se está ejecutando el programa:

1 DateFormat df = DateFormat.getDateInstance();

La clase DateFormat es encontrada en el paquete java.text

Page 2: Fechas en Java

 Convertiendo a StringPodemos convertir un objeto Date a String con el método format.

12345678910

import java.util.*;import java.text.*;public class NowString {public static void main(String[] args) {Date now = new Date();DateFormat df = DateFormat.getDateInstance();String s = df.format(now);System.out.println("Hoy es " + s);}}

El  método getInstance sin  argumentos  crea  un objeto  en el   formato default  o  sin  estilo.   Java también provee algunos estilos alternativos para fechas los cuales se pueden obtener a través de la sobrecarga del método getInstance(int style). DateFormat provee algunas constantes de solo lectura  para  que  podamos  usar  de  argumentos  en  el  método getInstance como por  ejemplo: SHORT, MEDIUM, LONG y FULL.

12345678910111213141516171819202122

import java.util.*;import java.text.*;public class StyleDemo {public static void main(String[] args) {Date now = new Date();DateFormat df = DateFormat.getDateInstance();DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL);String s = df.format(now);String s1 = df1.format(now);String s2 = df2.format(now);String s3 = df3.format(now);String s4 = df4.format(now);System.out.println("(Default) Hoy es:" + s);System.out.println("(SHORT) Hoy es:" + s1);System.out.println("(MEDIUM) Hoy es:" + s2);System.out.println("(LONG) Hoy es:" + s3);System.out.println("(FULL) Hoy es:" + s4);}}

Page 3: Fechas en Java

Obtendremos:(Default) Hoy es:06/08/2012(SHORT) Hoy es:06/08/12(MEDIUM) Hoy es:06/08/2012(LONG) Hoy es:6 de agosto de 2012(FULL) Hoy es:lunes 6 de agosto de 2012 El   mismo   programa   lo   podemos   correr   en   la   misma   computadora   pero   en   esta   instancia cambiaremos la configuración regional a Sueco.

Obtendremos:(Default) Hoy es:2012-aug-06(SHORT) Hoy es:2012-08-06(MEDIUM) Hoy es:2012-aug-06(LONG) Hoy es:den 6 augusti 2012(FULL) Hoy es:den 6 augusti 2012 Con   estos   ejemplos   vemos   primero   las   diferencias   que   surgen   al   ejecutar   el  mismo   código, también surge una ventajas de escribir el código utilizando getInstance (lo hacemos una sola vez con una sola línea) pero también tenemos que tener en cuenta que puede ser contraproducente si queremos mostrar la fecha en un formato determinado (puede ser que la configuración regional sea diferente a la que nosotros queremos mostrar). Parsear un String

Podemos   usar   la   clase DateFormat para   crear   objetos   Date   desde   uno   String,   utilizando   el método parse().  Este método en particular  puede lanzar  una excepción ParseException,  por  lo tanto tenemos que cachearlo. Un ejemplo:

1234567891011121314

import java.util.*;import java.text.*;public class ParseExample {public static void main(String[] args) {String ds = "November 1, 2012";DateFormat df = DateFormat.getDateInstance();try {Date d = df.parse(ds);}catch(ParseException e) {System.out.println("Unable to parse " + ds);}}}

El método parse() lo podemos utilizar para crear fechas arbitrarias. Clase GregorianCalendar

Page 4: Fechas en Java

Una   forma   de   crear   un   objeto   que   represente   una   fecha   arbitraria   es   utilizar   el   siguiente constructor de la clase GregorianCalendar encontrada en el paquete java.util:

1 GregorianCalendar(int year, int month, int date);

Para el mes debemos saber que Enero es 0!!!, Febrero es 1 y así sucesivamente . Si no queremos utilizar   los   índices   porque   nos   puede   llevar   a   confusiones   entonces   podemos utilizar las constantes con los nombres de los meses. Si queremos crear una fecha hacemos así:

1 GregorianCalendar firstFligth = new GregorianCalendar (1982,Calendar.APRIL,30);Sin utilizar constantes tendríamos:

1 GregorianCalendar firstFligth = new GregorianCalendar (1982,3,30);Vamos a ver un ejemplo de cómo pasar un objeto GregorianCalendar a Date y luego a String. Para ello debemos utilizar el método getTime();

1234567891011

import java.util.*;import java.text.*;public class Flight {public static void main(String[] args) {GregorianCalendar finDelMundo = new GregorianCalendar(2012, Calendar.DECEMBER, 21);Date d = finDelMundo.getTime();DateFormat df = DateFormat.getDateInstance();String s = df.format(d);System.out.println("El fin del mundo llegaría el:" + s);}}

Obtendremos:El fin del mundo llegaría el:21/12/2012 Manipulación de Fechas

La clase GregorianCalendar ofrece métodos para manipular las fechas. Uno muy útil es add(). Con el método add() se pueden agregar unidades de tiempo como años, meses, y días. Para usar este método,  debemos   ingresar   cual   será  el   campo  afectado  y   la   cantidad  por   la   cual   se   lo  va  a incrementar. Algunas constantes para el campo son: DATE, MONTH, YEAR y WEEK_OF_YEAR.

Vemos un ejemplo:

12345

import java.util.*;import java.text.*;public class World {public static void main(String[] args) {GregorianCalendar finDelMundo = <strong>new</strong> GregorianCalendar(2012,

Page 5: Fechas en Java

67891011121314151617

Calendar.<em>DECEMBER</em>, 21);

finDelMundo.add(GregorianCalendar.<em>DATE</em>, 16);

Date d = finDelMundo.getTime();

DateFormat df = DateFormat.<em>getDateInstance</em>();

String s = df.format(d);

System.<em>out</em>.println("Si el fin del mundo no llega, entonces los reyes magos vendran el : " + s);}}

Obtendremos:Si el fin del mundo no llega, entonces los reyes magos vendrán el : 06/01/2013 SimpleDateFormat:

Las instancias default devueltas por DateFormat muchas veces puede ser suficiente para algunos propósitos,  pero  no   cubre   todo  el   aspectro  de  posibilidades.  Por  ello simpleDateFormat,   nos permite construir  nuestros  propios formatos.  Las fechas van a ser construidas tomando como referencia   un   String   que   especificará   un   patrón   para   que   las   fechas   sean   formateada   y/o parseadas.

Símbolo

Significado Tipo Ejemplo

G Era Text “GG” -> “AD”y Year Number “yy” -> “03?

“yyyy” -> “2003?M Month Text or Number “M” -> “7?

“M” -> “12?“MM” -> “07?“MMM” -> “Jul”“MMMM” -> “December”

d Day in month Number “d” -> “3?“dd” -> “03?

h Hour (1-12, AM/PM) Number “h” -> “3?“hh” -> “03?

H Hour (0-23) Number “H” -> “15?“HH” -> “15?

k Hour (1-24) Number “k” -> “3?“kk” -> “03?

K Hour (0-11 AM/PM) Number “K” -> “15?“KK” -> “15?

m Minute Number “m” -> “7?

Page 6: Fechas en Java

“m” -> “15?“mm” -> “15?

s Second Number “s” -> “15?“ss” -> “15?

S Millisecond (0-999) Number “SSS” -> “007?E Day in week Text “EEE” -> “Tue”

“EEEE” -> “Tuesday”D Day in year (1-365 or 1-

364)Number “D” -> “65?

“DDD” -> “065?F Day of week in month (1-

5)Number “F” -> “1?

w Week in year (1-53) Number “w” -> “7?W Week in month (1-5) Number “W” -> “3?a AM/PM Text “a” -> “AM”

“aa” -> “AM”z Time zone Text “z” -> “EST”

“zzz” -> “EST”“zzzz” -> “Eastern Standard Time”

‘ Excape for text Delimiter “‘hour’ h” -> “hour 9?” Single quote Literal “ss”SSS” -> “45’876?Symbol Meaning Type ExampleG Era Text “GG” -> “AD”y Year Number “yy” -> “03?

“yyyy” -> “2003?M Month Text or Number “M” -> “7?

“M” -> “12?“MM” -> “07?“MMM” -> “Jul”“MMMM” -> “December”

d Day in month Number “d” -> “3?“dd” -> “03?

h Hour (1-12, AM/PM) Number “h” -> “3?“hh” -> “03?

H Hour (0-23) Number “H” -> “15?“HH” -> “15?

k Hour (1-24) Number “k” -> “3?“kk” -> “03?

K Hour (0-11 AM/PM) Number “K” -> “15?“KK” -> “15?

m Minute Number “m” -> “7?“m” -> “15?“mm” -> “15?

s Second Number “s” -> “15?“ss” -> “15?

S Millisecond (0-999) Number “SSS” -> “007?E Day in week Text “EEE” -> “Tue”

Page 7: Fechas en Java

“EEEE” -> “Tuesday”D Day in year (1-365 or 1-

364)Number “D” -> “65?

“DDD” -> “065?F Day of week in month (1-

5)Number “F” -> “1?

w Week in year (1-53) Number “w” -> “7?W Week in month (1-5) Number “W” -> “3?a AM/PM Text “a” -> “AM”

“aa” -> “AM”z Time zone Text “z” -> “EST”

“zzz” -> “EST”“zzzz” -> “Eastern Standard Time”

‘ Excape for text Delimiter “‘hour’ h” -> “hour 9?” Single quote Literal “ss”SSS” -> “45’876? Vemos un ejemplo:

1234567891011121314

import java.text.DateFormat;import java.text.SimpleDateFormat;import java.text.ParseException;import java.util.Date;

public class DateFormatExample4 {public static void main(String[] args) {Date now = new Date();String dateString = now.toString();System.out.println(" 1. " + dateString);SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");System.out.println(" 3. " + format.format(now));}}

Obtendremos:1. Mon Aug 06 11:12:00 ART 20122. lun ago 06 11:12:00 ART 2012