Dominando Fecha y Hora en Java: Constructores, Métodos y Mejores Prácticas
Java proporciona la clase Date en el paquete java.util, que encapsula la fecha y hora actuales.
La clase Date soporta dos constructores:
| Nº | Constructor y Descripción |
|---|---|
| 1 | Date() – Inicializa el objeto con la fecha y hora actuales. |
| 2 | Date(long millisec) – Acepta argumento igual a milisegundos transcurridos desde medianoche, 1 enero 1970. |
Métodos de la clase Date:
| Nº | Método y Descripción |
|---|---|
| 1 | boolean after(Date date) – True si el objeto Date invocador es posterior a la fecha especificada. |
| 2 | boolean before(Date date) – True si el objeto Date invocador es anterior a la fecha especificada. |
| 3 | Object clone() – Duplica el objeto Date invocador. |
| 4 | int compareTo(Date date) – Compara valor del objeto invocador con date. Retorna 0 si iguales, negativo si anterior, positivo si posterior. |
| 5 | int compareTo(Object obj) – Idéntico a compareTo(Date) si obj es Date; sino lanza ClassCastException. |
| 6 | boolean equals(Object date) – True si el objeto Date invocador tiene misma hora y fecha que la especificada. |
| 7 | long getTime() – Milisegundos transcurridos desde 1 enero 1970. |
| 8 | int hashCode() – Código hash del objeto invocador. |
| 9 | void setTime(long time) – Establece hora y fecha según time (milisegundos desde 1 enero 1970). |
| 10 | String toString() – Convierte objeto Date a string y lo devuelve. |
Obteniendo Fecha y Hora Actuales
Método muy fácil para obtener fecha y hora actual. Usa un objeto Date simple con toString():
Ejemplo
Demo en Vivoimport java.util.Date;
public class DemoFecha {
public static void main(String args[]) {
Date fecha = new Date();
System.out.println(fecha.toString());
}
}
Resultado:
Salida
lun may 04 09:51:52 CDT 2009
Comparación de Fechas
Tres formas de comparar dos fechas:
- Usar
getTime()para obtener milisegundos desde 1/1/1970 para ambos objetos y comparar. - Usar métodos
before(),after(),equals(). Ejemplo:new Date(99, 2, 12).before(new Date(99, 2, 18))retorna true. - Usar
compareTo(), definido por interfaz Comparable e implementado por Date.
Formateo de Fechas con SimpleDateFormat
SimpleDateFormat es una clase concreta para formatear y parsear fechas de manera sensible a locale. Permite patrones definidos por el usuario.
Ejemplo
Demo en Vivoimport java.util.*;
import java.text.*;
public class DemoFecha {
public static void main(String args[]) {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
System.out.println("Fecha Actual: " + ft.format(dNow));
}
}
Resultado:
Salida
Fecha Actual: dom 2004.07.18 at 04:14:09 PM PDT
Códigos de Formato SimpleDateFormat
Para especificar formato de hora, usa cadena de patrón. Todas las letras ASCII son reservadas como letras de patrón:
| Carácter | Descripción | Ejemplo |
|---|---|---|
| G | Designador de era | AD |
| y | Año en 4 dígitos | 2001 |
| M | Mes en año | Julio o 07 |
| d | Día en mes | 10 |
| h | Hora en AM/PM (1-12) | 12 |
| H | Hora en día (0-23) | 22 |
| m | Minuto en hora | 30 |
| s | Segundo en minuto | 55 |
| S | Milisegundo | 234 |
| E | Día en semana | Martes |
| D | Día en año | 360 |
| F | Día de semana en mes | 2 (segundo mié. en julio) |
| w | Semana en año | 40 |
| W | Semana en mes | 1 |
| a | Marcador AM/PM | PM |
| k | Hora en día (1-24) | 24 |
| K | Hora en AM/PM (0-11) | 10 |
| z | Zona horaria | Hora Estándar Este |
| ' | Escape para texto | Delimitador |
| " | Comilla simple | ` |
Formateo de Fechas con printf
El formateo de fecha/hora se hace fácilmente con printf. Usas formato de dos letras empezando con t y terminando en una letra de la tabla.
Ejemplo
Demo en Vivoimport java.util.Date;
public class DemoFecha {
public static void main(String args[]) {
Date fecha = new Date();
String str = String.format("Fecha/Hora Actual: %tc", fecha);
System.out.printf(str);
}
}
Resultado:
Salida
Fecha/Hora Actual: sáb dic 15 16:37:57 MST 2012
Sería tedioso proporcionar la fecha múltiples veces para formatear cada parte. Por eso, una cadena de formato puede indicar el índice del argumento a formatear.
El índice debe seguir inmediatamente al % y terminar con $.
Ejemplo
Demo en Vivoimport java.util.Date;
public class DemoFecha {
public static void main(String args[]) {
Date fecha = new Date();
System.out.printf("%1$s %2$tB %2$td, %2$tY", "Fecha límite:", fecha);
}
}
Resultado:
Salida
Fecha límite: febrero 09, 2004
Alternativamente, usa la bandera <. Indica que se use el mismo argumento que en la especificación de formato anterior.
Ejemplo
Demo en Vivoimport java.util.Date;
public class DemoFecha {
public static void main(String args[]) {
Date fecha = new Date();
System.out.printf("%s %tB %<te, %<tY", "Fecha límite:", fecha);
}
}
Resultado:
Salida
Fecha límite: febrero 09, 2004
Caracteres de Conversión de Fecha y Hora
| Carácter | Descripción | Ejemplo |
|---|---|---|
| c | Fecha y hora completa | lun may 04 09:51:52 CDT 2009 |
| F | Fecha ISO 8601 | 2004-02-09 |
| D | Fecha EE.UU. (mes/día/año) | 02/09/2004 |
| T | Hora 24h | 18:05:19 |
| r | Hora 12h | 06:05:19 pm |
| R | Hora 24h sin segundos | 18:05 |
| Y | Año 4 dígitos (con ceros) | 2004 |
| y | Últimos 2 dígitos del año | 04 |
| C | Primeros 2 dígitos del año | 20 |
| B | Nombre completo del mes | Febrero |
| b | Nombre abreviado del mes | Feb |
| m | Mes 2 dígitos (con ceros) | 02 |
| d | Día 2 dígitos (con ceros) | 03 |
| e | Día 2 dígitos (sin ceros) | 9 |
| A | Nombre completo día semana | Lunes |
| a | Nombre abreviado día semana | Lun |
| j | Día del año 3 dígitos | 069 |
| H | Hora 2 dígitos (00-23) | 18 |
| k | Hora 2 dígitos (0-23) | 18 |
| I | Hora 2 dígitos (01-12) | 06 |
| l | Hora 2 dígitos (1-12) | 6 |
| M | Minutos 2 dígitos | 05 |
| S | Segundos 2 dígitos | 19 |
| L | Milisegundos 3 dígitos | 047 |
| N | Nanosegundos 9 dígitos | 047000000 |
| P | Marcador mañana/tarde mayúsculas | PM |
| p | Marcador mañana/tarde minúsculas | pm |
| z | Desplazamiento numérico RFC 822 desde GMT | -0800 |
| Z | Zona horaria | PST |
| s | Segundos desde 1970-01-01 00:00:00 GMT | 1078884319 |
| Q | Milisegundos desde 1970-01-01 00:00:00 GMT | 1078884319047 |
Hay otras clases útiles relacionadas con Fecha y Hora. Para más detalles, consulta la documentación estándar de Java.
Parseando Strings a Fechas
La clase SimpleDateFormat tiene métodos adicionales, notablemente parse(), que intenta parsear un string según el formato almacenado en el objeto SimpleDateFormat dado.
Ejemplo
Demo en Vivoimport java.util.*;
import java.text.*;
public class DemoFecha {
public static void main(String args[]) {
SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
String input = args.length == 0 ? "1818-11-11" : args[0];
System.out.print(input + " Parsea como ");
Date t;
try {
t = ft.parse(input);
System.out.println(t);
} catch (ParseException e) {
System.out.println("Inanalizable usando " + ft);
}
}
}
Ejecución de ejemplo:
Salida
1818-11-11 Parsea como mié nov 11 00:00:00 EST 1818
Durmiendo por un Tiempo
Puedes dormir desde 1 milisegundo hasta la vida de tu computadora. Ejemplo: dormir 3 segundos:
Ejemplo
Demo en Vivoimport java.util.*;
public class DemoDormir {
public static void main(String args[]) {
try {
System.out.println(new Date() + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date() + "\n");
} catch (Exception e) {
System.out.println("¡Excepción!");
}
}
}
Resultado:
Salida
dom may 03 18:04:41 GMT 2009 dom may 03 18:04:51 GMT 2009
Midiendo Tiempo Transcurrido
A veces necesitas medir punto en tiempo en milisegundos. Reescribamos el ejemplo anterior:
Ejemplo
Demo en Vivoimport java.util.*;
public class DemoDiferencia {
public static void main(String args[]) {
try {
long inicio = System.currentTimeMillis();
System.out.println(new Date() + "\n");
Thread.sleep(5*60*10);
System.out.println(new Date() + "\n");
long fin = System.currentTimeMillis();
long diff = fin - inicio;
System.out.println("Diferencia: " + diff);
} catch (Exception e) {
System.out.println("¡Excepción!");
}
}
}
Resultado:
Salida
dom may 03 18:16:51 GMT 2009 dom may 03 18:16:57 GMT 2009 Diferencia: 5993
Clase GregorianCalendar
GregorianCalendar es una implementación concreta de Calendar que implementa el calendario gregoriano normal. No discutimos Calendar aquí; consulta documentación estándar.
El método getInstance() de Calendar retorna un GregorianCalendar inicializado con fecha/hora actual en locale y zona horaria por defecto. GregorianCalendar define dos campos: AD y BC, representando las dos eras del calendario gregoriano.
Constructores para GregorianCalendar:
| Nº | Constructor y Descripción |
|---|---|
| 1 | GregorianCalendar() – Default con hora actual en zona horaria y locale por defecto. |
| 2 | GregorianCalendar(int año, int mes, int día) – Con fecha dada en zona/locale por defecto. |
| 3 | GregorianCalendar(int año, int mes, int día, int hora, int minuto) – Con fecha y hora dadas. |
| 4 | GregorianCalendar(int año, int mes, int día, int hora, int minuto, int segundo) – Con fecha y hora completas. |
| 5 | GregorianCalendar(Locale locale) – Basado en hora actual en zona por defecto con locale dado. |
| 6 | GregorianCalendar(TimeZone zona) – Basado en hora actual en zona dada con locale por defecto. |
| 7 | GregorianCalendar(TimeZone zona, Locale locale) – Basado en hora actual en zona y locale dados. |
Métodos de soporte útiles de GregorianCalendar:
| Nº | Método y Descripción |
|---|---|
| 1 | void add(int campo, int cantidad) – Añade cantidad (con signo) de tiempo al campo dado, según reglas del calendario. |
| 2 | protected void computeFields() – Convierte UTC en milisegundos a valores de campos de tiempo. |
| 3 | protected void computeTime() – Convierte valores de campos de tiempo a UTC en milisegundos. |
| 4 | boolean equals(Object obj) – Compara este GregorianCalendar con referencia a objeto. |
| 5 | int get(int campo) – Obtiene valor para campo de tiempo dado. |
| 6 | int getActualMaximum(int campo) – Máximo valor que el campo podría tener, dada la fecha actual. |
| 7 | int getActualMinimum(int campo) – Mínimo valor que el campo podría tener, dada la fecha actual. |
| 8 | int getGreatestMinimum(int campo) – Valor mínimo más alto para el campo si varía. |
| 9 | Date getGregorianChange() – Obtiene fecha de cambio del calendario gregoriano. |
| 10 | int getLeastMaximum(int campo) – Valor máximo más bajo para el campo si varía. |
| 11 | int getMaximum(int campo) – Valor máximo para el campo. |
| 12 | Date getTime() – Obtiene hora actual de este Calendar. |
| 13 | long getTimeInMillis() – Obtiene hora actual como long. |
| 14 | TimeZone getTimeZone() – Obtiene zona horaria. |
| 15 | int getMinimum(int campo) – Valor mínimo para el campo. |
| 16 | int hashCode() – Sobrescribe hashCode. |
| 17 | boolean isLeapYear(int año) – Determina si el año dado es bisiesto. |
| 18 | void roll(int campo, boolean up) – Añade/resta una unidad de tiempo en campo sin cambiar campos mayores. |
| 19 | void set(int campo, int valor) – Establece campo de tiempo con valor dado. |
| 20 | void set(int año, int mes, int día) – Establece valores para año, mes, día. |
| 21 | void set(int año, int mes, int día, int hora, int minuto) – Establece año, mes, día, hora, minuto. |
| 22 | void set(int año, int mes, int día, int hora, int minuto, int segundo) – Establece todos los campos. |
| 23 | void setGregorianChange(Date fecha) – Establece fecha de cambio del calendario gregoriano. |
| 24 | void setTime(Date fecha) – Establece hora actual con Date dado. |
| 25 | void setTimeInMillis(long millis) – Establece hora actual desde valor long. |
| 26 | void setTimeZone(TimeZone valor) – Establece zona horaria con valor dado. |
| 27 | String toString() – Representación string de este calendario. |
Ejemplo
Demo en Vivoimport java.util.*;
public class DemoGregorianCalendar {
public static void main(String args[]) {
String meses[] = {"Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"};
int año;
GregorianCalendar gcal = new GregorianCalendar();
System.out.print("Fecha: ");
System.out.print(meses[gcal.get(Calendar.MES)]);
System.out.print(" " + gcal.get(Calendar.DIA_DEL_MES) + " ");
System.out.println(año = gcal.get(Calendar.AÑO));
System.out.print("Hora: ");
System.out.print(gcal.get(Calendar.HORA) + ":");
System.out.print(gcal.get(Calendar.MINUTO) + ":");
System.out.println(gcal.get(Calendar.SEGUNDO));
if(gcal.isLeapYear(año)) {
System.out.println("El año actual es bisiesto");
} else {
System.out.println("El año actual no es bisiesto");
}
}
}
Resultado:
Salida
Fecha: Abr 22 2009 Hora: 11:25:27 El año actual no es bisiesto
Para lista completa de constantes en Calendar, consulta documentación estándar de Java.
Java
- Clases y objetos en C#: Fundamentos para POO robusta
- Obtener la Fecha y Hora Actual en Python: Guía Práctica
- Variables y Literales en Java: Guía Completa
- Entender Expresiones, Sentencias y Bloques en Java
- Clases y Objetos en Java: Guía Práctica
- Clases y métodos abstractos en Java: Guía completa
- Dominando clases anidadas e internas en Java: Tipos, ejemplos y mejores prácticas
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Java throw vs throws: Dominando el manejo de excepciones con ejemplos prácticos
- Dominando Autoboxing y Unboxing en Java: Ejemplos Prácticos y Mejores Prácticas
- Serialización de Objetos en Java: Persistencia y Restauración de Objetos