[Métodos] Obtener fecha y hora - Formatos de fechas - Conversiones (Parte I)

Obtener fecha y hora - Formatos de fechas


Para obtener la fecha y hora en java hay varias clases utiles para hacerlo:

java.util.Calendar public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<calendar>
java.util.GregorianCalendar public class GregorianCalendar extends Calendar
java.util.Date public class Date extends Object implements Serializable, Cloneable, Comparable
java.sql.Date public class Date extends Date


Clase Calendar


Clase abstracta que puede ser instancia a través del método de clase getInstance()
Cuenta con un sin fin de atributos estaticos del tipo 'int' y métodos que podremos ir obteniendo con la fecha y hora actual del sistema.

Bastará con declarar la clase y darle un nombre, llamar a la misma clase para que ejecute el método.
Luego ya podremos usar el objeto para ir obteniendo los atributos de la clase que corresponde a cada magnitud de tiempo:
el formato que le doy para mostrar es hh:MM:ss.SS a dd/mm/yyyy era



Calendar miCalendar10 = Calendar.getInstance();
System.out.print(miCalendar10.get(Calendar.HOUR) +":");
System.out.print(miCalendar10.get(Calendar.MINUTE) +":");
System.out.print(miCalendar10.get(Calendar.SECOND) +".");
System.out.print(miCalendar10.get(Calendar.MILLISECOND) +" ");
System.out.print(miCalendar10.get(Calendar.AM_PM) +" ");
System.out.print(miCalendar10.get(Calendar.DATE) +"/");
System.out.print(miCalendar10.get(Calendar.MONTH) +"/");
System.out.print(miCalendar10.get(Calendar.YEAR) +" ");
System.out.print(miCalendar10.get(Calendar.ERA);


La salida por pantalla tendria la pinta:

  10:7:17.956 1 19/6/2016 1

Dado que la clase Calendar solo nos devuelve variables primitivas del tipo int, hará falta pulir un poco la salida para obtener el formato deseado:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  Calendar miCalendar10 = Calendar.getInstance();

  int hora = miCalendar10.get(Calendar.HOUR);
  String _hora = hora > 9 ? "" + hora : ("0"+ hora); 
  System.out.print(_hora + ":");

  int minutos = miCalendar10.get(Calendar.MINUTE);
  String _minutos = minutos > 9 ? "" + minutos : "0" + minutos; 
  System.out.print( _minutos + ":");

  int segundos = miCalendar10.get(Calendar.SECOND);
  String _segundos = segundos > 9 ? "" + segundos : "0" + segundos;
  System.out.print(_segundos +".");

  int milisegundos = miCalendar10.get(Calendar.MILLISECOND);
  String _milisegundos = milisegundos > 9 ? "" + milisegundos : "0" + milisegundos;
  System.out.print( _milisegundos +" ");

  if(miCalendar10.get(Calendar.AM_PM) == 0)
 System.out.print("AM ");
  else
 System.out.print("PM ");

  int dia = miCalendar10.get(Calendar.DATE);
  String _dia = dia > 9 ? "" + dia : ("0"+ dia); 
  System.out.print(_dia + "/");

  int mes = miCalendar10.get(Calendar.MONTH) + 1;
  String _mes = mes > 9 ? "" + mes : ("0"+ mes); 
  System.out.print(_mes + "/");

  System.out.print(miCalendar10.get(Calendar.YEAR) +" ");

  if(miCalendar10.get(Calendar.ERA) == 0)
 System.out.println("A.C.");
  else
 System.out.println("D.C.");

La salida ahora por pantalla al editarlo un poquito tendrá algo de Strings, asegurandonos completar las unidades con un cero adelante.

  10:07:17.956 PM 19/06/2016 D.C.

Para poder ver el método toString() de la propia clase, podriamos hacer algo similar a:



Calendar miCalendar10 = Calendar.getInstance();
String str = miCalendar10.toString();
str = str.substring(str.indexOf("time"), str.length() -1 );
String[] array = str.split(",");
for(String cadena : array)
    System.out.println(cadena);



Obteniendo algo como:

  time=1468978267659
  areFieldsSet=true
  areAllFieldsSet=true
  lenient=true
  zone=sun.util.calendar.ZoneInfo[id="America/Buenos_Aires"
  offset=-10800000
  dstSavings=0
  useDaylight=false
  transitions=62
  lastRule=null]
  firstDayOfWeek=2
  minimalDaysInFirstWeek=1
  ERA=1
  YEAR=2016
  MONTH=6
  WEEK_OF_YEAR=30
  WEEK_OF_MONTH=4
  DAY_OF_MONTH=19
  DAY_OF_YEAR=201
  DAY_OF_WEEK=3
  DAY_OF_WEEK_IN_MONTH=3
  AM_PM=1
  HOUR=10
  HOUR_OF_DAY=22
  MINUTE=31
  SECOND=7
  MILLISECOND=659
  ZONE_OFFSET=-10800000
  DST_OFFSET=0

Desde luego la clase calendar no es la mas recomendada para obtener la fecha y hora.




Clase GregorianCalendar


GregorianCalendar es una subclase concreta de Calendar y proporciona el sistema de calendario estándar utilizado por la mayoría del mundo.
GregorianCalendar es un calendario híbrido que es compatible tanto con los sistemas Gregorianos y Julianos del calendario con el apoyo de una sola discontinuidad, lo que corresponde de forma predeterminada a la fecha gregoriana, cuando se instituyó el calendario gregoriano (15 de octubre de 1582, en algunos países, más adelante en otros). La fecha de corte puede ser cambiado por el de llamada llamando setGregorianChange ().

Esta clase tiene varias formas de ser instanciada:
  • Llamando al método de clase de Calendar para instanciar, y realizar un pequeño casteo.
  • Pasandole a su constructor los parámetros:
    • Enteros ('int') correspondientes a el año, mes, dia, hora, minuto y segundo
    • Un objeto de la clase java.util.Locale
    • Otro objeto de la clase java.util.TimeZone

1
2
3
4
5
6
GregorianCalendar gc1 = (GregorianCalendar) Calendar.getInstance();
GregorianCalendar gc2 = new GregorianCalendar(2016, 07, 22);
Locale local = new Locale("es");
GregorianCalendar gc3 = new GregorianCalendar(local);
TimeZone tz = TimeZone.getTimeZone("America/Buenos_Aires");
GregorianCalendar gc4 = new GregorianCalendar(tz);

De encapsular el método que nos valia para la clase Calendar, obtendriamos el mismo resultado.

1
2
3
4
5
6
7
public static void separarAtributos(Calendar gc) {
    String aux = gc.toString().substring(28, gc.toString().length() - 1);
    String[] array = aux.split(",");
    for (String data : array) {
 System.out.println(data);
 }
}

De la misma forma que su predecesor, GregorianCalendar es otra clase para generar un objeto e ir extrayendo propiedad a propiedad en el caso que querramos solo una o unas pocas en especial.

  System.out.println(gc.get(GregorianCalendar.MONTH));




Clase util.Date


La clase java.util.Date es la mas util de todas. Bastará con crear el objeto y dispondremos de un objeto de fechas con el siguiente formato:

  EEE MMM dd HH:mm:ss zzz yyyy
  Fri Jul 22 12:20:00 ART 2016

Es un formato muy util y rápido en 1 sola linea si la intencion es obtener un formato de dia-mes-año
1
2
Date() miDate = new Date();
System.out.println(miDate);

Se podrían obtener los campos de fechas de manera indivual pero están todos deprecados de la JDK version 1.1(funcionan pero no es recomendado).
En su lugar recomiendan usar la clase abstracta java.util.Calendar para obtener las fechas indivudualmente:

1
2
3
4
5
6
7
8
9
Date date = new Date();

// NO ES RECOMENDABLE
System.out.println(date.getMonth());

Calendar cal = Calendar.getInstance();
cal.setTime(date);

System.out.println(cal.get(Calendar.MONTH));

Para lo cual si hemos de obtener los atributos por separados, hay que recordar que el metodo setTime(Date d) de la clase Calendar recibe por parámetro a el objeto Date del cual queremos extraer la información.



Clase sql.Date


Date exactamente igual pero del paquete sql es subClase de la clase con mismo nombre del paquete util. Tiene 2 constructores para setear con parámetros enteros ('int') el año-mes-dia (Pero esta deprecada y no es recomendable su uso.
1
2
3
Date sqlDate = new Date(2016, 07, 22);

System.out.println(sqlDate.getMonth());

Y otro constructor estable, que recibe como parámetro un parámetro del tipo 'long' que representa los milisegundos que pasaron desde el 1ro de enero de 1970.
Si sos de las personas que no llevan la cuenta, un atributo de la clase calendar nos la dice por nosotros:

1
2
3
4
5
6
Calendar cal = Calendar.getInstance();
long ms = cal.getTimeInMillis();

Date sqlDate = new Date(ms);

System.out.println(sqlDate);

Al hacerlo obtendremos como resultado el formato mas utilizado en base de datos y no será necesario preocuparnos por el formato adecuado: (yyyy-MM-dd)

  2016-07-22





No hay comentarios:

Publicar un comentario