java timestamp rfc3339

Salida RFC 3339 Marca de tiempo en Java



timestamp rfc3339 (8)

Quiero dar salida a una marca de tiempo con un desplazamiento PST (por ejemplo, 2008-11-13T13: 23: 30-08: 00). java.util.SimpleDateFormat no parece mostrar desplazamientos de zona horaria en el formato hora: minuto , excluye los dos puntos. ¿Hay una manera simple de obtener esa marca de tiempo en Java?

// I want 2008-11-13T12:23:30-08:00 String timestamp = new SimpleDateFormat("yyyy-MM-dd''T''h:m:ssZ").format(new Date()); System.out.println(timestamp); // prints "2008-11-13T12:23:30-0800" See the difference?

Además, SimpleDateFormat no puede analizar correctamente el ejemplo anterior. ParseException una ParseException .

// Throws a ParseException new SimpleDateFormat("yyyy-MM-dd''T''h:m:ssZ").parse("2008-11-13T13:23:30-08:00")


Desde el "departamento de obtenerlo hecho", una solución es usar expresiones regulares para arreglar la cadena después de que SimpleDateFormat se haya completado. Algo como s / (/ d {2}) (/ d {2}) $ / $ 1: $ 2 / en Perl.

Si está remotamente interesado en esto, editaré esta respuesta con el código de Java que funciona.

Pero sí. Estoy golpeando este problema también. RFC3339, ¡te estoy mirando!

EDITAR:

Esto funciona para mí

// As a private class member private SimpleDateFormat rfc3339 = new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssZ"); String toRFC3339(Date d) { return rfc3339.format(d).replaceAll("(//d//d)(//d//d)$", "$1:$2"); }


Encontré un PasteBin perdido que me ayudó con el problema: http://pastebin.com/y3TCAikc

En caso de que su contenido sea eliminado más adelante:

// I want 2008-11-13T12:23:30-08:00 String timestamp = new SimpleDateFormat("yyyy-MM-dd''T''h:m:ssZ").format(new Date()); System.out.println(timestamp); // prints "2008-11-13T12:23:30-0800" See the difference? // Throws a ParseException new SimpleDateFormat("yyyy-MM-dd''T''h:m:ssZ").parse("2008-11-13T13:23:30-08:00") SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd''T''h:m:ss.SZ");


SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd''T''h:m:ss.SZ");

¿No es exactamente lo que necesitas?


El problema es que Z produce el desplazamiento de la zona horaria sin dos puntos (:) como separador.


Consulte el paquete Joda Time . Hacen que el formato de fecha RFC 3339 sea mucho más fácil.

Joda Ejemplo:

DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String outRfc = fmt.print(dt);


Hice una clase de InternetDateFormat para RFC3339.

Pero el comentario del código fuente es japonés.

PD: Creé edición en inglés y refactoré un poco.


A partir de Java 7, existe la secuencia de patrones X para la zona horaria ISO8601. Para cadenas en el formato que describes, usa XXX . Ver la documentación .

Muestra:

System.out.println(new SimpleDateFormat("yyyy-MM-dd''T''HH:mm:ssXXX") .format(new Date()));

Resultado:

2014-03-31T14:11:29+02:00


Pasé bastante tiempo buscando una respuesta al mismo problema y encontré algo aquí: http://developer.android.com/reference/java/text/SimpleDateFormat.html

Respuesta sugerida:

String timestamp = new SimpleDateFormat("yyyy-MM-dd''T''h:m:ssZZZZZ").format(new Date());

Si notas que estoy usando 5 ''Z'' en lugar de uno. Esto da la salida con dos puntos en el desplazamiento de esta manera: "2008-11-13T12: 23: 30-08: 00". Espero eso ayude.