¿Cómo obtener el momento actual en formato ISO 8601 con fecha, hora y minutos?
¿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);
Úselo SimpleDateFormat
para formatear cualquier Date
objeto 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.
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
Temporal
comoInstant
oLocalDateTime
, pero carecen de soporte para formateadores o datos de zona horaria. SóloZonedDateTime
funciona 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.
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 SimpleDateFormat
instancia 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: setTimeZone
no acepta una Cadena (corregido por Paul)
A partir de Java 8 puedes simplemente hacer:
Instant.now().toString();
De los java.time.Instant
documentos:
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
.