Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Java

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
1Date() – Inicializa el objeto con la fecha y hora actuales.
2Date(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
1boolean after(Date date) – True si el objeto Date invocador es posterior a la fecha especificada.
2boolean before(Date date) – True si el objeto Date invocador es anterior a la fecha especificada.
3Object clone() – Duplica el objeto Date invocador.
4int compareTo(Date date) – Compara valor del objeto invocador con date. Retorna 0 si iguales, negativo si anterior, positivo si posterior.
5int compareTo(Object obj) – Idéntico a compareTo(Date) si obj es Date; sino lanza ClassCastException.
6boolean equals(Object date) – True si el objeto Date invocador tiene misma hora y fecha que la especificada.
7long getTime() – Milisegundos transcurridos desde 1 enero 1970.
8int hashCode() – Código hash del objeto invocador.
9void setTime(long time) – Establece hora y fecha según time (milisegundos desde 1 enero 1970).
10String 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 Vivo
import 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:

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 Vivo
import 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ácterDescripciónEjemplo
GDesignador de eraAD
yAño en 4 dígitos2001
MMes en añoJulio o 07
dDía en mes10
hHora en AM/PM (1-12)12
HHora en día (0-23)22
mMinuto en hora30
sSegundo en minuto55
SMilisegundo234
EDía en semanaMartes
DDía en año360
FDía de semana en mes2 (segundo mié. en julio)
wSemana en año40
WSemana en mes1
aMarcador AM/PMPM
kHora en día (1-24)24
KHora en AM/PM (0-11)10
zZona horariaHora Estándar Este
'Escape para textoDelimitador
"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 Vivo
import 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 Vivo
import 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 Vivo
import 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ácterDescripciónEjemplo
cFecha y hora completalun may 04 09:51:52 CDT 2009
FFecha ISO 86012004-02-09
DFecha EE.UU. (mes/día/año)02/09/2004
THora 24h18:05:19
rHora 12h06:05:19 pm
RHora 24h sin segundos18:05
YAño 4 dígitos (con ceros)2004
yÚltimos 2 dígitos del año04
CPrimeros 2 dígitos del año20
BNombre completo del mesFebrero
bNombre abreviado del mesFeb
mMes 2 dígitos (con ceros)02
dDía 2 dígitos (con ceros)03
eDía 2 dígitos (sin ceros)9
ANombre completo día semanaLunes
aNombre abreviado día semanaLun
jDía del año 3 dígitos069
HHora 2 dígitos (00-23)18
kHora 2 dígitos (0-23)18
IHora 2 dígitos (01-12)06
lHora 2 dígitos (1-12)6
MMinutos 2 dígitos05
SSegundos 2 dígitos19
LMilisegundos 3 dígitos047
NNanosegundos 9 dígitos047000000
PMarcador mañana/tarde mayúsculasPM
pMarcador mañana/tarde minúsculaspm
zDesplazamiento numérico RFC 822 desde GMT-0800
ZZona horariaPST
sSegundos desde 1970-01-01 00:00:00 GMT1078884319
QMilisegundos desde 1970-01-01 00:00:00 GMT1078884319047

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 Vivo
import 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 Vivo
import 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 Vivo
import 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
1GregorianCalendar() – Default con hora actual en zona horaria y locale por defecto.
2GregorianCalendar(int año, int mes, int día) – Con fecha dada en zona/locale por defecto.
3GregorianCalendar(int año, int mes, int día, int hora, int minuto) – Con fecha y hora dadas.
4GregorianCalendar(int año, int mes, int día, int hora, int minuto, int segundo) – Con fecha y hora completas.
5GregorianCalendar(Locale locale) – Basado en hora actual en zona por defecto con locale dado.
6GregorianCalendar(TimeZone zona) – Basado en hora actual en zona dada con locale por defecto.
7GregorianCalendar(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
1void add(int campo, int cantidad) – Añade cantidad (con signo) de tiempo al campo dado, según reglas del calendario.
2protected void computeFields() – Convierte UTC en milisegundos a valores de campos de tiempo.
3protected void computeTime() – Convierte valores de campos de tiempo a UTC en milisegundos.
4boolean equals(Object obj) – Compara este GregorianCalendar con referencia a objeto.
5int get(int campo) – Obtiene valor para campo de tiempo dado.
6int getActualMaximum(int campo) – Máximo valor que el campo podría tener, dada la fecha actual.
7int getActualMinimum(int campo) – Mínimo valor que el campo podría tener, dada la fecha actual.
8int getGreatestMinimum(int campo) – Valor mínimo más alto para el campo si varía.
9Date getGregorianChange() – Obtiene fecha de cambio del calendario gregoriano.
10int getLeastMaximum(int campo) – Valor máximo más bajo para el campo si varía.
11int getMaximum(int campo) – Valor máximo para el campo.
12Date getTime() – Obtiene hora actual de este Calendar.
13long getTimeInMillis() – Obtiene hora actual como long.
14TimeZone getTimeZone() – Obtiene zona horaria.
15int getMinimum(int campo) – Valor mínimo para el campo.
16int hashCode() – Sobrescribe hashCode.
17boolean isLeapYear(int año) – Determina si el año dado es bisiesto.
18void roll(int campo, boolean up) – Añade/resta una unidad de tiempo en campo sin cambiar campos mayores.
19void set(int campo, int valor) – Establece campo de tiempo con valor dado.
20void set(int año, int mes, int día) – Establece valores para año, mes, día.
21void set(int año, int mes, int día, int hora, int minuto) – Establece año, mes, día, hora, minuto.
22void set(int año, int mes, int día, int hora, int minuto, int segundo) – Establece todos los campos.
23void setGregorianChange(Date fecha) – Establece fecha de cambio del calendario gregoriano.
24void setTime(Date fecha) – Establece hora actual con Date dado.
25void setTimeInMillis(long millis) – Establece hora actual desde valor long.
26void setTimeZone(TimeZone valor) – Establece zona horaria con valor dado.
27String toString() – Representación string de este calendario.

Ejemplo

Demo en Vivo
import 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

  1. Clases y objetos en C#: Fundamentos para POO robusta
  2. Obtener la Fecha y Hora Actual en Python: Guía Práctica
  3. Variables y Literales en Java: Guía Completa
  4. Entender Expresiones, Sentencias y Bloques en Java
  5. Clases y Objetos en Java: Guía Práctica
  6. Clases y métodos abstractos en Java: Guía completa
  7. Dominando clases anidadas e internas en Java: Tipos, ejemplos y mejores prácticas
  8. Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
  9. Java throw vs throws: Dominando el manejo de excepciones con ejemplos prácticos
  10. Dominando Autoboxing y Unboxing en Java: Ejemplos Prácticos y Mejores Prácticas
  11. Serialización de Objetos en Java: Persistencia y Restauración de Objetos