Java: formato de fechas con SimpleDateFormat

En este artículo, usaremos la clase SimpleDateFormat de Java con ejemplos para mostrar cómo formatear una fecha y un calendario en Java.

Introducción

Java proporciona una API extensa para manejar la fecha y la hora. En este artículo usaremos SimpleDateFormat de Java para dar formato a las fechas.

Before formatting dates, you'll have to know Cómo obtener la fecha y hora actual en Java.

Especificadores de formato

Los especificadores de formato de fecha y hora se utilizan para construir patrones para representar datos en un formato en el que nos gustaría presentarlos.

En el mundo real, algunos componentes de fecha u hora a menudo se representan de más de una forma. Cuando se trata de especificadores de formato de hora y fecha en Java, esos componentes también tienen dos o más representaciones; a veces es útil usar una versión corta, mientras que las versiones más largas son más concisas y oficiales.

Formato de fecha simple

SimpleDateFormat solo funciona con objetos Date y . En Java 8, se agregan varias otras clases para reemplazar la API de fecha y hora existente, por lo que no es inusual tropezar con constructores y métodos obsoletos al manejar objetos Date.

Crear un objeto SimpleDateFormat es bastante fácil. El constructor acepta un patrón de cadena:

1
SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMM dd. yyyy.");

Vale la pena mencionar que si llamamos al constructor sin argumentos, se creará un objeto formateador con el patrón predeterminado de:

1
MM/dd/yy, H:mm aa

Si cambiamos de opinión sobre el patrón más tarde, siempre podemos aplicar otro a un objeto que hayamos creado previamente, y el anterior será anulado:

1
formatter.applyPattern("'date': yyyy.MM.dd -- 'time': H:mm:ss");

Nota: En este patrón, queríamos que algunas palabras se interpretaran literalmente, así que las escapamos con comillas simples.

En aras de la brevedad, hemos puesto las Reglas de formato al final del artículo si no está familiarizado con ellas.

Formateo System.currentTimeMillis()

Formatear el número de milisegundos transcurridos desde la época de UNIX, es decir, 1 de enero de 1970, 00:00:00 GMT, es bastante simple:

1
2
3
4
SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMM dd. yyyy. -- H:mm aa");

String formatted = formatter.format(System.currentTimeMillis());
System.out.println(formatted);

Ejecutar este fragmento de código produce:

1
Tue, Aug 11. 2020. -- 4:48 AM

Internamente, el valor “largo” se convierte en una “Fecha”.

Formateo java.util.Date

Sin embargo, formatear una Fecha es esencialmente lo mismo, nosotros mismos proporcionamos una instancia de Date:

1
2
3
4
5
SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMM dd. yyyy. -- H:mm aa");

Date date = new Date();
String formatted = formatter.format(date);
System.out.println(formatted);

La salida resultante es:

1
Tue, Aug 11. 2020. -- 4:52 AM

Formateo java.util.Calendar

El uso de un Calendario facilita la personalización y el juego con fechas personalizadas. Si alguna marca de tiempo importante requiere un énfasis, es fácil hacerlo con un Calendario:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMM dd. yyyy. -- H:mm aa");

Calendar calendar = Calendar.getInstance();
calendar.set(1969, Calendar.AUGUST, 15, 17, 35, 27);

# SimpleDateFormat works with Dates
Date date = calendar.getTime();

String formatted = formatter.format(date);
System.out.println(formatted);

La salida resultante es:

1
Fri, Aug 15. 1969. -- 17:35 PM

Reglas de formato

En aras de la claridad, si aún no está familiarizado con las reglas/patrones de formato utilizados en el artículo, aquí hay una lista de los especificadores de formato más utilizados:


Carácter Componente de fecha u hora Tipo de contenido Ejemplo

Y/y Year Year 1969;69

M Mes del año Mes Agosto;Ago;08

w Semana del año Número 21

W Semana del mes Número 2

d Día del mes Número 07;15

D Día del año Número 176

F Día de la semana en el mes\ Número 2;3 (e.g. second Tuesday this month)

E Nombre del día en la semana Texto Monday;Mon

u Número de día de la semana\ Número 1 (Monday = 1)

a Marcador am/pm Texto PM;AM

h Hora en am/pm (1-12) Número 12

H Hora del día (0-23) Número 0

k Hora del día (1-24) Número 24

K Hora en am/pm (0-11) Número 0

m Minuto en hora Número 43

s Segundo en el minuto Número 58

S Milisegundo en segundo Número 965

z Zona horaria Zona horaria CEST;GMT-08:00

Designador de época G Texto AD


Cada tipo de contenido sigue ciertas reglas, principalmente con respecto a la cantidad de caracteres de patrón utilizados en el patrón del formateador:

  • Año - Si el Calendario del formateador es gregoriano y el número de caracteres del patrón es 2, el año se trunca a los 2 dígitos más a la derecha; de lo contrario, se interpreta como un número. En otros calendarios, se aplican formularios específicos de calendario.
  • Mes: si el número de caracteres del patrón es 3 o más, el mes se muestra como texto; de lo contrario, se muestra como un número. Hay formas textuales breves y completas disponibles: si el número de caracteres del patrón es 4 o más, se muestra la forma completa; de lo contrario, se muestra el corto.
  • Número: el número de caracteres del patrón es el número mínimo de dígitos. Si ese número es mayor que la cantidad de dígitos que realmente necesitamos para representar un número, entonces el número tiene el prefijo correspondiente con la cantidad de ceros.
  • Texto - Si el número de caracteres del patrón es 4 o más, se utiliza el formulario completo; de lo contrario, se utiliza una forma corta o abreviada, si está disponible.
  • Zona horaria - Se muestran como texto si tienen nombres. Hay formas cortas y completas disponibles: si el número de caracteres del patrón es 4 o más, se muestra la forma completa; de lo contrario, se muestra el corto. Algunas zonas horarias no tienen nombres y se pueden mostrar en varias formas diferentes, de las cuales una es, p. el valor de compensación GMT.

Estos son algunos ejemplos de patrones y los resultados que producen:


Patrón de fecha y hora Resultado "EEEE, MMM dd. aaaa. -- H:mm aa zzzz" viernes, 15 de agosto de 1969. -- 17:35 p. m., hora estándar de Europa Central "EEE, MMM dd. aaaa. -- H:mm aa zz" viernes, 15 de agosto de 1969. -- 17:35 p. m. CET "MMMM yyyy. GGGG" Septiembre 0200. AD "MMM aaaa. GG" septiembre de 200. d.C. "MM-dd-aaaa HH:mm:ss:SSSS" 15-09-2020 17:35:27:0953


Conclusión

En este artículo, hemos cubierto la clase SimpleDateFormat y cómo podemos usarla para formatear fechas.

Hemos formateado la hora actual (en milisegundos) desde el inicio de la hora UNIX, un objeto Date regular y un objeto Calendar.

Finalmente, hemos cubierto los especificadores de formato y las reglas de formato aplicadas a los resultados de SimpleDateFormat. eFormat`.