2008-11-14 56 views
32

Deseo emitir un sello de tiempo con un PST compensado (por ejemplo, 2008-11-13T13: 23: 30-08: 00). java.util.SimpleDateFormat no parece generar 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?RFC 3339 Marca de tiempo de salida 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 un ParseException.

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

Respuesta

31

A partir de Java 7, está la cadena de X patrón para la zona horaria ISO8601. Para cadenas en el formato que describe, use XXX. See the documentation.

muestra:

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

Resultado:

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

Obtengo ParseException mientras analizo "2017-12-12T02: 01: 43.924-08: 00" que obtuve de Google Cloud APIs –

+0

@pujanjain Eso tiene milisegundos, que este patrón no incluye. –

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

¿No es exactamente lo que necesita?

+0

No. Si intenta analizar la marca de tiempo indicada anteriormente, lanzará ParseException. – Cristian

+0

Funciona para "2008-11-13T13: 23: 30-0800". – FoxyBOA

+3

que no tiene el mismo formato de fecha que el anterior. –

13

Salida del 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); 
+2

Esta respuesta sería realmente útil con un ejemplo. – noah

+1

@Biff Puede simplificar su ejemplo de código. No es necesario formatear. Joda-Time se establece automáticamente en el formato [ISO 8601] (https://en.wikipedia.org/wiki/ISO_8601)/[RFC 3339] (http://www.ietf.org/rfc/rfc3339.txt). Simplemente llame al método 'toString', explícita o implícitamente. De esta manera, 'String output = dt.toString();' –

4

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

+0

Absolutamente correcto, pero no nos dice cómo solucionarlo. La solución de jjohn me lo arregló. – scaganoff

11

Desde el "departamento de lograr que se haga," Una solución es utilizar expresiones regulares para arreglar la cadena después de SimpleDateFormat ha completado. Algo como s/(\ d {2}) (\ d {2}) $/$ 1: $ 2/en Perl.

Si no está ni remotamente interesado en esto, voy a editar esta respuesta con el código Java de trabajo.

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

EDIT:

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"); 
} 
1

encontré una PasteBin callejero que me ayudó con el tema: http://pastebin.com/y3TCAikc

Sólo en caso de su contenido después se eliminan:

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

hice una clase InternetDateFormat para RFC33 39.

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

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

9

Pasé mucho tiempo buscando una respuesta a la misma cuestión y he encontrado algo aquí: http://developer.android.com/reference/java/text/SimpleDateFormat.html

Respuesta posible :

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

Si nota que estoy usando 5 'Z' en vez 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.

+0

Gracias - su respuesta está subestimada - esto es lo que finalmente me permitió generar RFC 3339. Usar X me dio 'Causado por: java.lang.IllegalArgumentException: Componente de patrón ilegal: XXX \t en org.apache.commons.lang.time .FastDateFormat.parsePattern (FastDateFormat.java:691) \t en org.apache.commons.lang.time.FastDateFormat.init (FastDateFormat.java:558) ' – Zasz

+0

Feliz de ayudar :) –

Cuestiones relacionadas