Convertir java.util.Date en String

1. Información general

En este tutorial, mostraremos cómo podemos convertir objetos Date en objetos String en Java . Para hacerlo, trabajaremos con el tipo java.util.Date anterior , así como con la nueva API de fecha / hora introducida en Java 8.

Si desea aprender cómo hacer la conversión opuesta, es decir, de tipos de cadena a fecha , puede consultar este tutorial aquí.

Para obtener más detalles sobre la nueva API de fecha / hora , consulte este tutorial relacionado.

2. Conversión de java.util.Date en String

Aunque no deberíamos usar java.util.Date si estamos trabajando con Java 8, a veces no tenemos otra opción (por ejemplo, estamos recibiendo el objeto Date de una biblioteca que no está bajo nuestro control).

En tales casos, tenemos varias formas de convertir java.util.Date en String a nuestra disposición.

2.1. Preparación del objeto de fecha

Primero declaremos una representación de cadena esperada de nuestra fecha y definamos un patrón de formato de fecha deseado:

private static final String EXPECTED_STRING_DATE = "Aug 1, 2018 12:00 PM"; private static final String DATE_FORMAT = "MMM d, yyyy HH:mm a";

Ahora necesitamos el objeto Date real que nos gustaría convertir. Usaremos una instancia de Calendar para crearlo:

TimeZone.setDefault(TimeZone.getTimeZone("CET")); Calendar calendar = Calendar.getInstance(); calendar.set(2018, Calendar.AUGUST, 1, 12, 0); Date date = calendar.getTime();

Hemos establecido la zona horaria predeterminada en CET para evitar problemas al trabajar con la nueva API más adelante. Debemos tener en cuenta que la fecha en sí no tiene ninguna zona horaria, pero su toString () usa la zona horaria predeterminada actual .

Usaremos esta instancia de Date en todos nuestros ejemplos a continuación.

2.2. Usando la clase SimpleDateFormat

Usaremos el método format () de la clase SimpleDateFormat en este ejemplo. Creemos una instancia de ella usando nuestro formato de fecha:

DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);

Después de esto, podemos formatear nuestra fecha y compararla con la salida esperada:

String formattedDate = formatter.format(date); assertEquals(EXPECTED_STRING_DATE, formattedDate);

2.3. Uso de la clase Abstract DateFormat

Como pudimos haber visto, SimpleDateFormat es una subclase de la clase abstracta DateFormat . Esta clase proporciona varios métodos para formatear la fecha y la hora.

Lo usaremos para lograr el mismo resultado que el anterior:

String formattedDate = DateFormat .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT) .format(date);

Con este enfoque, estamos pasando patrones de estilo: MEDIO para la fecha y CORTO para el tiempo en nuestro caso.

3. Usando la clase Formatter

Otra forma sencilla de obtener la misma cadena que en los ejemplos anteriores es usar la clase Formatter .

Si bien esta puede no ser la solución más legible, es una línea de una sola línea segura para subprocesos que podría ser útil, especialmente en un entorno de subprocesos múltiples (debemos tener en cuenta que SimpleDateFormat no es seguro para subprocesos):

String formattedDate = String.format("%1$tb %1$te, %1$tY %1$tI:%1$tM %1$Tp", date);

Usamos 1 $ para indicar que pasaremos solo un argumento para usar con cada bandera. Se puede encontrar una explicación detallada de los indicadores en Conversiones de fecha / hora, parte de la clase Formateador .

4. Conversión mediante la API de fecha / hora de Java 8

La API de fecha / hora de Java 8 es mucho más poderosa que las clases java.util.Date y java.util.Calendar , y deberíamos usarla siempre que sea posible. Veamos cómo podemos usarlo para convertir nuestro objeto Date existente en String .

Esta vez, usaremos la clase DateTimeFormatter y su método format () , así como el mismo patrón de fecha, declarado en la Sección 2.1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);

Para usar la nueva API, necesitamos convertir nuestro objeto Date en un objeto Instant :

Instant instant = date.toInstant();

Dado que nuestro String esperado tiene partes de fecha y hora, también necesitamos convertir el objeto Instant a LocalDateTime :

LocalDateTime ldt = instant .atZone(ZoneId.of("CET")) .toLocalDateTime();

Y finalmente, podemos obtener fácilmente nuestra Cadena formateada :

String formattedDate = ldt.format(formatter);

5. Conclusión

En este artículo, ilustramos varias formas de convertir objetos java.util.Date en String . Primero mostramos cómo hacerlo usando las clases java.util.Date y java.util.Calendar más antiguas y las clases de formato de fecha correspondientes.

Luego usamos la clase Formatter y, finalmente, la API de fecha / hora de Java 8.

Como siempre, el código fuente completo se puede encontrar en GitHub.