Horodatage de sortie RFC 3339 en Java
Question
Je souhaite émettre un horodatage avec un décalage PST (par exemple, 2008-11-13T13: 23: 30-08 - 00). java.util.SimpleDateFormat
ne semble pas générer de décalages de fuseaux horaires dans le 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 même, SimpleDateFormat
ne peut pas analyser correctement l'exemple ci-dessus. Il renvoie une ParseException
.
// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")
La solution
À partir de Java 7, il existe la chaîne de modèle X
pour le fuseau horaire ISO8601. Pour les chaînes dans le format que vous décrivez, utilisez XXX
. Voir la documentation .
Exemple:
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
.format(new Date()));
Résultat:
2014-03-31T14:11:29+02:00
Autres conseils
Découvrez le package Joda Time . Ils facilitent grandement 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);
À partir du département "Faites-le," Une solution consiste à utiliser des expressions rationnelles pour corriger la chaîne après la fin de SimpleDateFormat. Quelque chose comme s / (\ d {2}) (\ d {2}) $ / $ 1: $ 2 / en Perl.
Si cela vous intéresse même à distance, je vais éditer cette réponse avec le code Java actif.
Mais oui. Je frappe aussi ce problème. RFC3339, je vous regarde!
EDIT:
Cela fonctionne 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)<*>quot;, "$1:$2");
}
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:
Horodatage de la chaîne = new SimpleDateFormat ("aaaa-MM-jj'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 le décalage, comme ceci: "2008-11-13T12: 23: 30-08: 00". J'espère que ça aide.
Le problème est que Z produit le décalage de fuseau horaire sans deux points (:) comme séparateur.
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");
N’est-ce pas exactement ce dont vous avez besoin?
J'ai trouvé un PasteBin errant qui m'a aidé à résoudre le problème: http://pastebin.com/y3TCAikc .
Juste au cas où son contenu serait supprimé ultérieurement:
// 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");
J'ai créé une classe InternetDateFormat pour RFC3339.
Mais le commentaire du code source est en japonais.
PS: j'ai créé l'édition anglaise et un peu de refactoring.