web-dev-qa-db-fra.com

Horodatage RFC 3339 en sortie en Java

Je veux sortir un horodatage avec un décalage PST (par exemple, 2008-11-13T13: 23: 30-08: 00). Java.util.SimpleDateFormat ne semble pas produire de décalages de fuseau horaire au format heure: minute, il exclut les deux-points. Existe-t-il un moyen simple d'obtenir cet horodatage 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?

De plus, SimpleDateFormat ne peut pas analyser correctement l'exemple ci-dessus. Il lance un ParseException.

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

À partir de Java 7, il y a la chaîne de modèle X pour le fuseau horaire ISO8601. Pour les chaînes au format que vous décrivez, utilisez XXX. Voir la documentation .

Échantillon:

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

Résultat:

2014-03-31T14:11:29+02:00
40
Daniel Beck

Découvrez le package Joda Time . Ils facilitent le formatage de la date RFC 3339.

Exemple Joda:

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

Dans le département "get it done", une solution consiste à utiliser des expressions régulières pour corriger la chaîne une fois SimpleDateFormat terminé. Quelque chose comme s/(\ d {2}) (\ d {2}) $/$ 1: 2 $/en Perl.

Si cela vous intéresse même à distance, je modifierai cette réponse avec le code Java Java.

Mais ouais. Je frappe aussi ce problème. RFC3339, je vous regarde!

ÉDITER:

Ça marche pour moi

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

J'ai passé beaucoup de temps à chercher une réponse au même problème et j'ai trouvé quelque chose ici: http://developer.Android.com/reference/Java/text/SimpleDateFormat.html

Réponse suggérée:

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

Si vous remarquez que j'utilise 5 'Z' au lieu d'un. Cela donne la sortie avec deux points dans l'offset comme ceci: "2008-11-13T12: 23: 30-08: 00". J'espère que ça aide.

11
Rahul Ravindran

Le problème est que Z produit le décalage de fuseau horaire sans deux-points (:) comme séparateur.

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

N'est-ce pas exactement ce dont vous avez besoin?

3
FoxyBOA

J'ai créé une classe InternetDateFormat pour RFC3339.

Mais le commentaire du code source est japonais.

PS: J'ai créé l'édition anglaise et refactorisé un peu.

1
Bladean Mericle

J'ai trouvé un Pastebin errant qui m'a aidé avec le problème: http://Pastebin.com/y3TCAikc

Juste au cas où son contenu serait supprimé plus tard:

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