¿Cómo obtener el momento actual en formato ISO 8601 con fecha, hora y minutos?

Resuelto yegor256 asked hace 14 años • 24 respuestas

¿Cuál es la forma más elegante de obtener una presentación formateada ISO 8601 del momento actual, UTC? Debería verse así: 2010-10-12T08:50Z.

Ejemplo:

String d = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);
yegor256 avatar Oct 12 '10 19:10 yegor256
Aceptado

Úselo SimpleDateFormatpara formatear cualquier Dateobjeto que desee:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

El uso de a new Date()como se muestra arriba formateará la hora actual.

Joachim Sauer avatar Oct 12 '2010 12:10 Joachim Sauer

Java 8 Nativo

java.time lo hace simple desde Java 8. Y seguro para subprocesos.

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

Resultado:2015-04-14T11:07:36.639Z

Es posible que tengas la tentación de utilizar archivos más ligeros Temporalcomo Instanto LocalDateTime, pero carecen de soporte para formateadores o datos de zona horaria. Sólo ZonedDateTimefunciona fuera de la caja.

Al ajustar o encadenar las opciones/operaciones de ZonedDateTime y DateTimeFormatter , puede controlar fácilmente la zona horaria y la precisión , hasta cierto punto:

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

Resultado:2015-04-14T11:07:00+01:00[Europe/Paris]

Los requisitos refinados, como la eliminación de la segunda parte, aún deben cumplirse mediante formatos personalizados o procesos de publicación personalizados.

.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07

Para Java 6 y 7, puede considerar puertos anteriores de java.time como ThreeTen-Backport , que también tiene un puerto para Android . Ambos son más livianos que Joda y han aprendido de la experiencia de Joda , especialmente. considerando que java.time está diseñado por el autor de Joda.

Sheepy avatar Apr 14 '2015 11:04 Sheepy

Para sistemas donde la zona horaria predeterminada no es UTC:

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

La SimpleDateFormatinstancia puede declararse como una constante global si se necesita con frecuencia, pero tenga en cuenta que esta clase no es segura para subprocesos. Debe sincronizarse si varios subprocesos acceden simultáneamente.

EDITAR: Preferiría Joda Time si hago muchas manipulaciones diferentes de Horas/Fechas...
EDITAR2: corregido: setTimeZoneno acepta una Cadena (corregido por Paul)

user85421 avatar Oct 12 '2010 13:10 user85421

A partir de Java 8 puedes simplemente hacer:

Instant.now().toString();

De los java.time.Instantdocumentos:

ahora

public static Instant now()

Obtiene el instante actual del reloj del sistema.

Esto consultará el reloj UTC del sistema para obtener el instante actual.

 


public String toString()

Una representación de cadena de este instante utilizando la representación ISO-8601.

El formato utilizado es el mismo que DateTimeFormatter.ISO_INSTANT.