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.