Output RFC 3339 Zeitstempel in Java
Frage
I ausgegeben werden soll ein Zeitstempel mit einem PST-Offset (beispielsweise 2008-11-13T13: 23: 30-08: 00). java.util.SimpleDateFormat
scheint nicht zu Ausgabezeitzone Offsets in der Stunde: Minute Format, es schließt den Doppelpunkt. Gibt es eine einfache Art und Weise, dass die Zeitstempel in Java zu bekommen?
// 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?
Auch kann SimpleDateFormat
nicht richtig das obige Beispiel analysieren. Es wirft ein ParseException
.
// Throws a ParseException
new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZ").parse("2008-11-13T13:23:30-08:00")
Lösung
Starten in Java 7 gibt es die X
Musterkette für ISO8601 Zeitzone. Für Strings im Format, das Sie beschreiben, verwenden XXX
. finden Sie in der Dokumentation .
Beispiel:
System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
.format(new Date()));
Ergebnis:
2014-03-31T14:11:29+02:00
Andere Tipps
Schauen Sie sich die Joda Zeit Paket. Sie machen RFC 3339 Datum der Formatierung viel einfacher.
Joda Beispiel:
DateTime dt = new DateTime(2011,1,2,12,45,0,0, DateTimeZone.UTC);
DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
String outRfc = fmt.print(dt);
Von dem „es dept getan“, eine Lösung ist, regulären Ausdrücke zu verwenden, um die Zeichenfolge zu reparieren, nachdem Simple abgeschlossen hat. So etwas wie s / (\ d {2}) (\ d {2}) $ / $ 1: $ 2 / in Perl.
Wenn Sie auch nur entfernt an diesem interessiert sind, bearbeite ich diese Antwort mit dem Arbeits Java-Code.
Aber, ja. Ich schlage auch dieses Problem. RFC3339, ich freue mich auf Sie!
EDIT:
Dies funktioniert für mich
// 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");
}
Ich verbrachte ziemlich viel Zeit für eine Antwort auf die gleiche Frage suchen und ich fand etwas hier: http://developer.android.com/reference/java/text/SimpleDateFormat.html
Vorgeschlagene Antwort:
String timestamp = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ssZZZZZ").format(new Date());
Wenn Sie merke ich, bin mit 5 ‚Z‘ statt einer. Dies gibt den Ausgang mit einem Doppelpunkt in dem wie folgt versetzt: „2008-11-13T12: 23: 30-08: 00“. Hoffe, es hilft.
Das Problem ist, dass die Zeitzone Z ohne Doppelpunkt (:) als Trenn Offset liefert.
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");
Ist das nicht, was genau Sie brauchen?
fand ich ein Streu Pastebin, die mir geholfen mit dem Thema aus: http://pastebin.com/y3TCAikc
Für den Fall, dessen Inhalt später erhalten gelöscht:
// 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");
ich eine InternetDateFormat Klasse für RFC3339.
Aber Quellcode Kommentar ist Japanisch.
PS:. Ich englische Ausgabe erstellt und Refactoring ein wenig