fechas en java
DESCRIPTION
javaTRANSCRIPT
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
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);}}
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
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,
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?
“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”
“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