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")
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top