Java: formato de fechas con DateTimeFormatter

En este tutorial, daremos formato a un objeto LocalDate, LocalTime, LocalDateTime y ZonedDateTime en Java usando DateTimeFormatter con ejemplos, usando patrones y enumeraciones StyleFormat.

Introducción

Java proporciona una API extensa para manejar la fecha y la hora. En este artículo, usaremos el DateTimeFormatter de Java para formatear fechas - LocalDate, LocalDatetime, LocalTime y ZonedDateTime.

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.

Formateador de fecha y hora

Java 8 revisó la API Fecha/Hora con clases seguras para subprocesos que reemplazaron las antiguas y torpes clases Date y Calendar.

Esto también nos presentó a la clase DateTimeFormatter, a diferencia de SimpleDateFormat de la antigua API.

Vale la pena señalar que LocalDate y LocalTime almacenan información solo sobre fechas y horas respectivamente, mientras que LocalDateTime contiene información sobre la fecha y la hora en un solo objeto.

Hay dos formas de instanciar un DateTimeFormatter:

Escribiendo un patrón:

1
2
DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("EEE, MMM dd. yyyy.");

Usando un formateador:

1
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;

Usando un método estático:

1. DateTimeFormatter.ofLocalizedDate(FormatStyle dateStyle)
2. DateTimeFormatter.ofLocalizedTime(FormatStyle timeStyle)
3. DateTimeFormatter.ofLocalizedDateTime(FormatStyle datetimeStyle)
4. DateTimeFormatter.ofLocalizedDateTime(FormatStyle dateStyle, FormatStyle timeStyle)

Por ejemplo, podríamos configurar un DateTimeFormatter con:

1
2
DateTimeFormatter formatter = DateTimeFormatter
        .ofLocalizedTime(FormatStyle.SHORT);

Tenga en cuenta que cada uno de ellos tiene un argumento obligatorio. FormatStyle es una enumeración integrada que proporciona algunos valores: FULL, LONG, MEDIUM y SHORT.

En la siguiente tabla se muestra cómo se ven los patrones de enumeración disponibles cuando se aplican a un objeto ZonedDateTime:


FormatStyle Descripción Estilo de fecha Estilo de hora Estilo de fecha y hora COMPLETO Muy detallado Jueves, 13 de agosto de 2020 00:43:00 hora de verano de Europa Central Jueves, 13 de agosto de 2020 a las 00:43:48 hora de verano de Europa Central LARGO Contiene la mayoría de los detalles 13 de agosto de 2020 00:45:27 CEST 13 de agosto de 2020 a las 00:44:40 CEST MEDIA Algunos detalles incluidos 13 de agosto de 2020 00:45:49 13 de agosto de 2020 00:46:29 CORTO Por lo general, numérico y más corto posible 13/8/20 00:47 13/08/20, 00:47


Formateo de la hora local

En los siguientes ejemplos de código, le mostraremos cómo hacer que algunos de los formateadores predefinidos hagan el trabajo por nosotros, además de crear el nuestro. Solo se necesitan unas pocas líneas de código:

1
2
3
4
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.MEDIUM);
LocalTime time = LocalTime.now();

System.out.println(time.format(formatter));

La salida resultante es:

1
5:17:00 AM

Sin embargo, debemos tener cuidado al usar formateadores predefinidos. En este caso, no podemos usar FormatStyle.LONG o FormatStyle.FULL, porque también proporcionan información sobre la zona horaria que generalmente no se almacena en el objeto LocalTime.

Veamos cómo queda cuando hacemos nuestro propio patrón:

1
2
3
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss a");
LocalTime time = LocalTime.now();
System.out.println(time.format(formatter));

Esto da como resultado:

1
10:58:28 AM

Por supuesto, eres libre de jugar con el patrón.

Formateo de fecha local

Todas las clases compatibles con DateTimeFormatter tienen un método format(DateTimeFormatter f), por lo que el proceso de aplicación del patrón es bastante simple:

1
2
3
4
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
LocalDate d = LocalDate.now();

System.out.println(d.format(formatter));

Esta pieza de código produce:

1
Thursday, August 13, 2020

Formateo de LocalDateTime

El formateo de un LocalDateTime se realiza de la misma manera:

1
2
3
4
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.MEDIUM);
LocalDateTime dateTime = LocalDateTime.now();

System.out.println(dateTime.format(formatter));

La salida resultante es:

1
August 13, 2020, 5:29:28 AM

Los patrones personalizados se crean de la misma manera:

1
2
3
4
DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("eee, MMM dd. yyyy.\nHH:mm:ss a");
LocalDateTime dt = LocalDateTime.now();
System.out.println(dt.format(formatter));

Esta pieza de código produce:

1
2
Tue, Aug 25. 2020.
11:05:20 AM

Formatear ZonedDateTime

Esta vez podemos usar casualmente el formateador predefinido para una salida completa:

1
2
3
4
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL);
ZonedDateTime dateTime = ZonedDateTime.now();

System.out.println(dateTime.format(formatter));

Esta pieza de código genera:

1
Thursday, August 13, 2020 at 5:32:49 AM Central European Summer Time

Cuando se trata de crear nuestros propios patrones para ZonedDateTime, tenemos toda la libertad de usar cualquier especificador que queramos:

1
2
3
4
DateTimeFormatter formatter = DateTimeFormatter
        .ofPattern("eee, MMM dd. yyyy.\nHH:mm:ss a - zzzz");
ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(dateTime.format(formatter));

Esto da como resultado:

1
2
Tue, Aug 25. 2020.
11:09:27 AM - Central European Summer Time

Reglas de formato

Los especificadores de formato para DateTimeFormatter difieren ligeramente de los de SimpleDateFormat. Si estás acostumbrado a trabajar con SimpleDateFormat, tendrás que ajustar algunos hábitos un poco:


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

Y/y Year Year 1969;69

M Mes del año Número/Texto agosto;agosto;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

Q/q Trimestre del año Número/Texto 2:T2:2do trimestre

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;M

e/c Día localizado en la semana Número/Texto Monday;Mon;M;1;01

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 Fracción de segundo Fracción 965

Un Mili del día Número 1234

n Nano del segundo Número 566787434

N Nano del día Número 56678743400

z Nombre de la zona horaria Nombre de la zona Hora estándar del Pacífico; hora del Pacífico

V ID de zona horaria ID de zona America/Los_Angeles; Z; -08:30

v Nombre de zona horaria Nombre de zona Hora del Pacífico; PT0

G Designador de la era Texto AD; Año del Señor; A


  • Texto: si se utilizan menos de 4 caracteres de patrón, el componente se presenta en forma abreviada. Exactamente 4 caracteres de patrón usarán la forma completa y exactamente 5 usarán la forma estrecha.
  • 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. c y F solo pueden tener una ocurrencia, mientras que d, H, h, K, k, m y s pueden tener dos ocurrencias. Solo D se puede usar hasta tres veces.
  • Número/Texto - Si se utilizan 3 o más caracteres de patrón, el componente se presenta en forma de texto; de lo contrario en número.
  • Fracción: el recuento de caracteres posibles está entre 1 y 9. Si se indica menos de 9, el valor se trunca y solo se emiten los dígitos más significativos.
  • Año: si 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.
  • ID de zona: si se utilizan 2 caracteres de patrón, se emite el ID de zona; de lo contrario, se lanza la excepción.
  • Nombre de la zona - Si el carácter del patrón es z, la salida es el nombre de la zona compatible con el horario de verano. Si no hay información suficiente para determinar si se aplica el horario de verano, se utilizará el nombre que ignora el horario de verano. Si el recuento de caracteres es 1, 2 o 3, se emite el nombre abreviado; si es 4, se emite el nombre completo. Cinco o más caracteres lanzan una excepción. En cuanto al carácter v, se ignora el horario de verano. Si se utiliza 1 carácter de patrón, se emite el nombre abreviado; si se utilizan 4, la salida es el nombre completo. Cualquier otro número de caracteres genera una excepción.

Conclusión

En este artículo, mostramos cómo formatear un LocalDate, LocalTime, LocalDateTime y ZonedDateTime utilizando la clase DateTimeFormatter de Java.

Licensed under CC BY-NC-SA 4.0