Pregunta

Quiero generar una marca de tiempo con un desplazamiento PST (por ejemplo, 2008-11-13T13: 23: 30-08: 00). java.util.SimpleDateFormat no parece generar compensaciones 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. Lanza una ParseException .

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

Solución

A partir de Java 7, existe la cadena de patrón X para la zona horaria ISO8601. Para las cadenas en el formato que describe, use XXX . Consulte 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

Otros consejos

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

Ejemplo de Joda:

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

Del " hacer que el departamento, " Una solución es usar expresiones regulares para arreglar la cadena después de que SimpleDateFormat se haya completado. Algo así como s / (\ d {2}) (\ d {2}) $ / $ 1: $ 2 / en Perl.

Si está incluso remotamente interesado en esto, editaré esta respuesta con el código Java en funcionamiento.

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)<*>quot;, "$1:$2");
}

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 (" aaaa-MM-dd'T'h: m: ssZZZZZ "). format (new Date ());

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

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

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

¿No es exactamente lo que necesitas?

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

En caso de que su contenido luego se elimine:

// 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");

Hice una clase InternetDateFormat para RFC3339.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top